如何使用服务定义对象

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.1,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

如何使用服务定义对象

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

通常,您会使用YAML、XML或PHP来描述服务定义。但是如果你在用服务容器做高级的事情,比如使用编译器通过或者创建一个依赖注入扩展时,您可能需要直接使用定义定义如何实例化服务的对象。

获取和设置服务定义

这里有一些使用服务定义的有用方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//查看是否有"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"定义定义定义(\ AppBundle \ NumberGenerator::类);容器->setDefinition (“app.number_generator”定义);//前面方法的快捷方式容器->注册(“app.number_generator”, \ AppBundle \ NumberGenerator::类);

使用定义

创建新定义

方法,除了操作和检索现有定义外,还可以定义新的服务定义定义类。

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

1 2 3 4 5 6 7 8 9 10 11
使用AppBundle配置UserConfigManager使用AppBundle配置CustomConfigManager使用欧宝娱乐app下载地址组件DependencyInjection定义定义定义(UserConfigManager::类);//重写类定义->setClass (CustomConfigManager::类);//获取为这个定义配置的类定义->getClass ();

构造函数参数

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

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
使用AppBundle配置DoctrineConfigManager使用欧宝娱乐app下载地址组件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将在欧宝娱乐app下载地址内部调用PHP语句require_once,这意味着每个请求只包含您的文件一次。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。