如何创建服务别名和标记服务为私有
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.0,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
如何创建服务别名和标记服务为私有
将服务标记为公共/私有
在定义服务时,您通常希望能够在应用程序代码中访问这些定义。这些服务被称为公共.例如,学说
服务是一项公共服务。方法从容器中获取它get ()
方法:
1
$学说=$容器->get (“原则”);
在某些情况下,是服务只有存在是为了被注入到另一个服务中不如上所示,打算直接从容器中获取。
在这些情况下,为了获得较小的性能提升,可以将服务设置为不公共(即私人):
- YAML
- XML
- PHP
1 2 3 4
服务:foo:类:例子\ Foo公众:假
1 2 3 4 5 6 7 8 9
<??> . xml version="1.0" encoding="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 //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“foo”类=“例子\ Foo”公共=“假”/>服务>容器>
1 2 3 4 5
使用欧宝娱乐app下载地址\组件\DependencyInjection\定义;$定义=新定义(“例子\ Foo”);$定义->setPublic (假);$容器->setDefinition (“foo”,$定义);
私有服务的特殊之处在于,如果它们只被注入一次,它们将从服务转换为内联实例化(例如:新的PrivateThing ()
).这提高了容器的性能。
既然服务是私人的,你不应该直接从容器中获取服务:
1
$容器->get (“foo”);
这可能有用,也可能没用,这取决于服务是否可以内联。简单地说:如果您不想从代码中直接访问服务,则可以将其标记为私有服务。
但是,如果一个服务被标记为私有,您仍然可以用别名(见下文)访问这个服务(通过别名)。
请注意
默认情况下,服务是公共的,但是将尽可能多的服务标记为私有是一个很好的实践。
混叠
有时您可能希望使用快捷方式访问某些服务。您可以通过别名来实现这一点,此外,您甚至可以别名非公共服务。
- YAML
- XML
- PHP
1 2 3 4 5 6
服务:app.phpmailer:类:AppBundle \ \ PhpMailer邮件app.mailer:别名:app.phpmailer
1 2 3 4 5 6 7 8 9 10 11
<??> . xml version="1.0" encoding="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 //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“app.phpmailer”类=“AppBundle \ PhpMailer”/><服务id=“app.mailer”别名=“app.phpmailer”/>服务>容器>
1 2 3 4 5
使用欧宝娱乐app下载地址\组件\DependencyInjection\定义;$容器->setDefinition (“app.phpmailer”,新定义(“AppBundle \ PhpMailer”));$containerBuilder->setAlias (“app.mailer”,“app.phpmailer”);
这意味着当直接使用容器时,您可以访问app.phpmailer
通过请求服务app.mailer
这样的服务:
1
$容器->get (“app.mailer”);//返回PhpMailer实例
提示
在YAML中,你还可以使用快捷方式来别名服务:
1 2 3
服务:#……app.mailer:“@app.phpmailer”
不以为然的服务
一旦你决定弃用某个服务(因为它已经过时或者你决定不再维护它),你可以弃用它的定义:
- YAML
- XML
- PHP
1 2 3
acme.my_service:类:...弃用:的“% service_id %”服务是弃用自2.8而且将是删除在3.0.
1 2 3 4 5 6 7 8 9 10 11
<??> . xml version="1.0" encoding="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 //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“acme.my_service”类=“…”><弃用>“%service_id%”服务自2.8以来已弃用,将在3.0中移除。弃用>服务>服务>容器>
1 2 3 4 5 6 7
$容器->注册(“acme.my_service”,“……”)->setDeprecated (真正的,“' %service_id% '服务自2.8以来已弃用,将在3.0中删除。”);
现在,每次使用此服务时,都会触发一个弃用警告,建议您停止或更改对该服务的使用。
消息实际上是一个消息模板,用于替换出现的% service_id %
服务id的占位符。你必须至少发生过一次% service_id %
模板中的占位符。
请注意
弃用消息是可选的。如果没有设置,Symfo欧宝娱乐app下载地址ny将显示以下默认消息:“%service_id%”服务已弃用。你应该停止使用它,因为它很快就会被删除。
.
提示
强烈建议您定义一个自定义消息,因为默认的消息太通用了。好的消息将告知该服务何时被弃用,直到维护它以及使用替代服务(如果有的话)。
对于服务装饰器(见上文),如果定义没有修改已弃用状态,则它将从被装饰的定义继承该状态。
谨慎
只有在用PHP声明定义时,才有可能“取消弃用”服务。