如何使用服务定义对象
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何使用服务定义对象
服务定义是描述容器应该如何构建服务的指令。它们不是应用程序使用的实际服务。容器将根据定义中的配置创建实际的类实例。
通常,您会使用YAML、XML或PHP来描述服务定义。但是如果你在用服务容器做高级的事情,比如使用编译器通过或者创建一个依赖注入扩展时,您可能需要直接使用定义
定义如何实例化服务的对象。
获取和设置服务定义
这里有一些使用服务定义的有用方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
使用ob娱乐下载\组件\DependencyInjection\定义;//查找是否有"app.mailer"定义$容器->hasDefinition (“app.mailer”);//确定是否有"app.mailer"定义或别名$容器->有(“app.mailer”);//获取"app.user_config_manager"定义$定义=$容器->getDefinition (“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::类);
使用定义
类
类的第一个可选参数定义
Class是从容器中获取服务时返回的对象的完全限定类名:
1 2 3 4 5 6 7 8 9 10 11
使用应用程序\配置\UserConfigManager;使用应用程序\配置\CustomConfigManager;使用ob娱乐下载\组件\DependencyInjection\定义;$定义=新定义(UserConfigManager::类);//重写类$定义->setClass (CustomConfigManager::类);//获取为这个定义配置的类$类=$定义->getClass ();
构造函数参数
类的第二个可选参数定义
类是一个数组,其中的参数传递给从容器中获取服务时返回的对象的构造函数:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
使用应用程序\配置\DoctrineConfigManager;使用ob娱乐下载\组件\DependencyInjection\定义;使用ob娱乐下载\组件\DependencyInjection\参考;$定义=新定义(DoctrineConfigManager::类,新引用(“原则”),//对另一个服务的引用“% app.config_table_name %”,//将被解析为容器参数的值]);//获取为该定义配置的所有参数$constructorArguments=$定义->getArguments ();//获取一个特定的参数$firstArgument=$定义->getArgument (0);//添加一个新的参数$定义->addArgument ($论点);//替换特定索引上的参数(0 =第一个参数)$定义->replaceArgument ($指数,$论点);//用传递的数组替换所有先前配置的参数$定义->setArguments ($参数);
谨慎
不要使用get ()
若要获取要作为构造函数参数注入的服务,则该服务还不可用。相反,使用参考
实例,如上面所示。
方法调用
如果你正在使用的服务使用setter注入,那么你也可以在定义中操作任何方法调用:
1 2 3 4 5 6 7 8
//获取所有配置的方法调用$methodCalls=$定义->getMethodCalls ();//配置一个新的方法调用$定义->addMethodCall (“setLogger”, (新引用(“日志”)));//用传递的数组替换之前配置的所有方法调用$定义->setMethodCalls ($methodCalls);
提示
在服务容器文章中的PHP代码块中还有更多使用定义的具体方法的示例,例如使用工厂创建服务而且如何管理与父服务的共同依赖关系.
请注意
这里更改服务定义的方法只能在容器编译之前使用。一旦容器被编译,您就不能进一步操作服务定义了。要了解有关编译容器的详细信息,请参见编译容器.
要求的文件
在某些情况下,您可能需要在加载服务本身之前包含另一个文件。为此,您可以使用setFile ()方法:
1
$定义->setFile (' / / /文件/ src /路径直接给的);
注意,Symfony将在ob娱乐下载内部调用PHP语句require_once
,这意味着每个请求只包含您的文件一次。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。