服务方法调用和Setter注入

服务方法调用和Setter注入

小费

如果您使用的是Autowiring,可以使用#[必需的]或者@必需的自动配置方法调用

通常,您需要通过构造函数注入依赖项。但有时,特别是如果依赖性是可选的,则可能需要使用“Setter注入”。例如:

// src / service / messagegenerator.php命名空间App \ Service.;PSR \ log \ loggerInterface;班级MessageGenerator.{私人的$ logger.;上市功能setlogger.LoggerInterface.$ logger.空白{$这一点- >记录器=$ logger.;}// ......}

配置容器拨打电话setlogger.方法,使用呼叫钥匙:

  • yaml.
    1 2 3 4 5 6
    #配置/服务.YAML服务App \ Service \ MessageGenerator#...呼叫-setlogger.['@logger']
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“UTF-8”?><容器XMLNS =.“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”XMLNS:XSI =“http://www.w3.org/2001/xmlschema-instance”XSI:Schemalocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><服务ID =“app \ service \ messagegenerator”><! -  ...  - ><呼叫方法=“setlogger”><争论类型=“服务”ID =“记录器”/>
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12
    // config / services.php命名空间欧宝娱乐app下载地址Symfony \ Component \ DependencyIngreation \ Loader \ Configurator;App \ Service \ MessageGenerator;返回功能containerconfigurator$ Configurator.{// ......$服务- >MessageGenerator.::班级//在Embfony之前的版本中5.1服务()函数称欧宝娱乐app下载地址为ref()- >称呼'setlogger'[服务'logger')]);};

要提供不可改变的服务,一些课程实施了不可变的设立者。此类定居者返回配置的类的新实例而不是突变它们所调用的对象:

// src / service / messagegenerator.php命名空间App \ Service.;PSR \ log \ loggerInterface;班级MessageGenerator.{私人的$ logger.;上市功能搭便车LoggerInterface.$ logger.自己{$新=克隆$这一点;$新- >记录器=$ logger.;返回$新;}// ......}

因为该方法返回一个单独的克隆实例,所以使用凋枯方法的返回值配置这样的服务方法($服务=$ service-> withlogger($ logger);)。要告诉容器应该这样做的配置就像:

  • yaml.
    1 2 3 4 5 6
    #配置/服务.YAML服务App \ Service \ MessageGenerator#...呼叫-搭便车!returns_clone.['@logger']
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“UTF-8”?><容器XMLNS =.“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”XMLNS:XSI =“https://www.w3.org/2001/xmlschema-instance”XSI:Schemalocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><服务ID =“app \ service \ messagegenerator”><! -  ...  - ><呼叫方法=“withlogger”returns-clone =“真的”><争论类型=“服务”ID =“记录器”/>
  • PHP.
    1 2 3 4 5 6
    // config / services.phpApp \ Service \ MessageGenerator;欧宝娱乐app下载地址symfony \ component \依赖等度incipt \ Refern;$容器- >登记MessageGenerator.::班级- >addmethodcall.'inslogger'[新的参考'logger'),真的);

小费

如果启用了Autowire,您也可以使用注释;与前面的例子一样:

/ *** @必需的* @return static.* /上市功能搭便车LoggerInterface.$ logger.{$新=克隆$这一点;$新- >记录器=$ logger.;返回$新;}

您也可以利用PHP 8静止的返回类型而不是@返回静止的注解。如果您不希望使用PHP 8的方法静止的返回类型和一个@必需的诠释要表现为枯萎,您可以添加一个@返回$这一点注释要禁用返回克隆特征。

5.1版中的新增功能:支持PHP 8静止的返回类型在Symfony 5.1中引入。欧宝娱乐app下载地址

这项工作包括代码样本,是在a下获得的许可Creative Commons by-SA 3.0执照。