如何使用服务定义对象

如何使用服务定义对象

服务定义是描述容器应该如何构建服务的说明。它们不是您的应用程序使用的实际服务。容器将根据定义中的配置创建实际类实例。

通常,您将使用Yaml,XML或PHP来描述服务定义。但是,如果您正在使用服务容器进行高级事物,例如使用编译器通过或创建一个依赖注入扩展,您可能需要直接工作定义定义如何实例化服务的对象。

获取和设置服务定义

有一些有用的方法来处理服务定义:

使用欧宝娱乐app下载地址symfony \ component \ decigendenceIngress \定义;//发现是否有“app.mailer”定义$容器->哈德希特'app.mailer');//查找是否有“app.mailer”定义或别名$容器->具有'app.mailer');//获取“app.user_config_manager”定义美元的定义=$容器->克服'app.user_config_manager');//获取“app.user_config_manager”ID或别名的定义美元的定义=$容器->findDefinition'app.user_config_manager');//添加一个新的“app.number_generator”定义美元的定义=定义\ app \ numbergenerator::班级);$容器->SetDefinition.“app.number_generator”美元的定义);//以前方法的快捷方式$容器->登记“app.number_generator”\ app \ numbergenerator::班级);

使用定义

创建新定义

除了操纵和检索现有定义外,您还可以使用该方法定义新的服务定义欧宝娱乐app下载地址symfony \ component \ decigendenceIngress \定义班级。

班级

的第一个可选参数定义类是从容器中获取服务时返回的对象的完全限定的类名:

使用app \ config \ customconfigManager;使用app \ config \ userconfigManager;使用欧宝娱乐app下载地址symfony \ component \ decigendenceIngress \定义;美元的定义=定义UserconfigManager.::班级);//覆盖课程美元的定义->套装CustomConfigManager.::班级);//获取为此定义配置的类$班级=美元的定义->getClass();

构造函数参数

第二个可选论点定义类是一个数组,其中传递到从容器中获取服务时返回的对象的构造函数的参数:

使用App \ Config \ DoctrineConfigManager;使用欧宝娱乐app下载地址symfony \ component \ decigendenceIngress \定义;使用欧宝娱乐app下载地址Symfony \ DependencyInjection \ \组件参考;美元的定义=定义doctrineconfigmanager::班级[参考'教义'),//另一个服务的引用“% app.config_table_name %”//将解析为容器参数的值]);//获取为此定义配置的所有参数$ constructorarguments.=美元的定义->getarguments.();//获得特定的论点firstArgument美元=美元的定义->Getargument.0.);//添加一个新的命名参数// $argumentName =构造函数中参数的名称,包括$符号美元的定义=美元的定义->setargument.'$ argumentname'argumentValue美元);//添加一个新参数美元的定义->addArgumentargumentValue美元);//替换指定索引的参数(0 =第一个参数)美元的定义->替换$ index.$争论);//用传递的数组替换所有先前配置的参数美元的定义->setArguments$争论);

警告

不要使用得到()要获取要注入构造函数参数的服务,该服务尚不可用。相反,使用a参考实例如上所示。

方法调用

如果您使用的服务使用Setter Injection,则可以在定义中操作任何方法调用:

//获取所有配置的方法调用$ methodcalls.=美元的定义->getmethodcalls.();//配置新的方法调用美元的定义->addmethodcall.'setlogger'[参考'logger')));//配置一个不可变定型美元的定义->addmethodcall.'inslogger'[参考'logger')),真正的);//用传递的数组替换所有先前配置的方法调用美元的定义->setmethodcalls.$ methodcalls.);

小费

还有更多示例在服务容器文章的PHP代码块中使用定义的具体方式示例,例如使用工厂创建服务如何使用父服务管理常见依赖项

笔记

此处只能在将容器编译之前使用更改服务定义的方法。一旦将容器编译,您无法进一步操作服务定义。要了解有关编译容器的更多信息,请参阅编译的容器

需要文件

在某些情况下,您可能需要在加载服务本身之前包含另一个文件。为此,您可以使用setfile()方法:

美元的定义->setfile.'/src/path/to/file/foo.php');

请注意,Symfony将欧宝娱乐app下载地址在内部调用PHP声明require_once,这意味着您的文件将仅包含一次一次。

这项工作,包括代码样本,是在一个创作共用BY-SA 3.0执照。