服务容器

服务容器

截屏视频

你更喜欢视频教程吗?检查欧宝娱乐app下载地址Symfony基本面屏幕系列

您的应用程序完整的一个“Mailer”对象可以帮助你发送电子邮件,而另一个对象可以帮助你将内容保存到数据库中。几乎一切你的应用" does "实际上是由这些对象之一完成的。每次你安装一个新的包,你就可以访问更多的包!

在Sy欧宝娱乐app下载地址mfony中,这些有用的对象被称为服务每个服务都存在于一个非常特殊的对象中叫做服务容器.容器允许您集中对象的构造方式。它使您的生活更轻松,促进一个强大的架构和超级快!

获取和使用服务

当你启动Symfony应用时,你的容器欧宝娱乐app下载地址已经包含了许多服务。这些都是像工具等着你去利用他们。在您的控制器中,您可以通过使用服务的类或接口名称的参数类型暗示来从容器“请求”服务。想要日志什么东西吗?没有问题:

/ / src /控制器/ ProductController.php名称空间App \控制器使用Psr \ \ LoggerInterface日志使用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件响应ProductController/ * ** @Route(“/产品”)* /公共函数列表LoggerInterface美元记录器响应美元记录器->信息“瞧,我刚用过一次服务!”);/ /……

还有哪些其他服务?通过跑步来找到答案:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
php bin /控制台调试:自动装配# this is just a *small* sample of the output…描述记录器实例。Psr \ Log \ LoggerInterface (monolog.logger)控制请求生命周期的请求堆栈。欧宝娱乐app下载地址Symfony \组件\ HttpFoundation \ RequestStack (request_stack)接口。欧宝娱乐app下载地址Symfony组件\ \ HttpFoundation \会议\ SessionInterface(会话)RouterInterface是所有路由器类都必须实现的接口。欧宝娱乐app下载地址Symfony \组件\ \ RouterInterface路由(router.default)[…]

当您在控制器方法中使用这些类型提示或在自己的服务, 欧宝娱乐app下载地址Symfony将自动传递给您匹配该类型的服务对象。

在整个文档中,您将看到如何使用驻留在容器中的许多不同的服务。

提示

实际上有许多容器中有更多的服务,每个服务在容器中都有一个唯一的id,比如会话router.default.完整的列表,你可以跑步phpbin /控制台调试:容器.但大多数时候,你不需要担心这个。看到选择特定的服务.看到如何调试服务容器和列表服务

在容器中创建/配置服务

你也可以组织你的自己的代码服务。例如,假设您需要向用户显示一个随机的、愉快的消息。如果您将此代码放入控制器中,它就不能被重用。相反,你决定创建一个新类:

/ / src /服务/ MessageGenerator.php名称空间App \服务MessageGenerator公共函数getHappyMessage()字符串美元的消息“你做到了!你更新了系统!神奇的!”“这是我今天看到的最酷的更新之一!”“伟大的工作!继续前进!”];美元指数用于美元的消息);返回美元的消息美元指数];

恭喜你!您已经创建了您的第一个服务类!你可以立即在控制器中使用它:

/ / src /控制器/ ProductController.php使用应用\ \ MessageGenerator服务使用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件响应/ * ** @Route(“/产品/新”)* /公共函数MessageGeneratormessageGenerator美元响应//由于类型提示,容器将实例化一个// new MessageGenerator and pass it to you!/ /……美元的消息messageGenerator美元->getHappyMessage();这个美元->addFlash“成功”美元的消息);/ /……

当你要MessageGenerator服务,容器构造一个新的MessageGenerator对象并返回它(参见下面的边栏)。但如果你从不要求服务,那就从来没有构造:节省内存和速度。作为奖励,这个MessageGenerator只创建服务一次:每次请求都会返回相同的实例。

将服务/配置注入到服务中

如果您需要访问日志记录器从内部服务MessageGenerator?没问题!创建一个__construct ()方法美元记录器LoggerInterfacetype-hint。设置为新美元记录器属性并在以后使用:

/ / src /服务/ MessageGenerator.php名称空间App \服务使用Psr \ \ LoggerInterface日志MessageGenerator私人美元记录器公共函数__constructLoggerInterface美元记录器这个美元->日志记录器美元记录器公共函数getHappyMessage()字符串这个美元->日志记录器->信息“马上就能找到快乐的信息了!”);/ /……

就是这样!容器将自动知道如何通过日志记录器实例化MessageGenerator.它是怎么知道要这么做的?自动装配.关键是LoggerInterfacetype-hint在你__construct ()方法和自动装配:真正的配置在services.yaml.当您键入参数提示时,容器将自动找到匹配的服务。如果不能,您将看到一个明确的异常和一个有用的建议。

顺便说一下,将依赖项添加到__construct ()方法被调用依赖注入

你应该如何使用LoggerInterfacetype-hint吗?你可以阅读你正在使用的任何特性的文档,或者通过运行获得一个自动连接类型提示列表:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
php bin /控制台调试:自动装配# this is just a *small* sample of the output…描述记录器实例。Psr \ Log \ LoggerInterface (monolog.logger)控制请求生命周期的请求堆栈。欧宝娱乐app下载地址Symfony \组件\ HttpFoundation \ RequestStack (request_stack)接口。欧宝娱乐app下载地址Symfony组件\ \ HttpFoundation \会议\ SessionInterface(会话)RouterInterface是所有路由器类都必须实现的接口。欧宝娱乐app下载地址Symfony \组件\ \ RouterInterface路由(router.default)[…]

处理多个服务

假设您还希望在每次进行站点更新时向站点管理员发送电子邮件。为此,创建一个新类:

/ / src /服务/ SiteUpdateManager.php名称空间App \服务使用应用\ \ MessageGenerator服务使用欧宝娱乐app下载地址Symfony \ \梅勒\ MailerInterface组件使用欧宝娱乐app下载地址Symfony \组件\ Mime \电子邮件SiteUpdateManager私人messageGenerator美元私人梅勒美元公共函数__constructMessageGeneratormessageGenerator美元MailerInterface梅勒美元这个美元->messageGeneratormessageGenerator美元这个美元->梅勒梅勒美元公共函数notifyOfSiteUpdate()保龄球happyMessage美元这个美元->messageGenerator->getHappyMessage();美元的电子邮件电子邮件())->(电子邮件保护)->(电子邮件保护)->主题“网站刚刚更新了!”->文本“有人更新了网站。我们告诉他们:happyMessage美元);这个美元->梅勒->发送美元的电子邮件);/ /……返回真正的

这需要MessageGenerator梅勒服务。这没有问题,我们通过类型提示它们的类和接口名称来询问它们!现在,可以使用这个新服务了。例如,在控制器中,您可以键入提示newSiteUpdateManager类并使用它:

/ / src /控制器/ SiteController.php名称空间App \控制器使用应用\ \ SiteUpdateManager服务/ /……SiteController扩展AbstractController公共函数SiteUpdateManagersiteUpdateManager美元/ /……如果siteUpdateManager美元->notifyOfSiteUpdate())这个美元->addFlash“成功”'通知邮件发送成功');/ /……

多亏了自动装配和你的输入提示__construct (),容器创建SiteUpdateManager对象,并将正确的参数传递给它。在大多数情况下,这是完美的。

手动布线参数

但是在一些情况下,服务的参数不能自动连接。例如,假设你想让管理电子邮件可配置:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
// src/Service/ siteupdatemanager //…class SiteUpdateManager{//…+私人adminEmail美元;- public function __construct(MessageGenerator $ MessageGenerator, MailerInterface $mailer)+ public function __construct(MessageGenerator $ MessageGenerator, MailerInterface $ mailler, string $adminEmail){/ /……+ $this->adminEmail = $adminEmail;} public function notifyOfSiteUpdate(): bool{//…$email = (new email()) //…- - > ('(电子邮件保护)”)+ - - - > ($ this - > adminEmail)/ /……;/ /……}}

如果你做了这个更改并刷新,你会看到一个错误:

不能自动装配服务" AppServiceSiteUpdateManager ":方法" __construct() "的参数" $adminEmail "必须有类型提示或显式给出一个值。

这是有道理的!容器不可能知道您想在这里传递什么值。没问题!在你的配置中,你可以显式地设置这个参数:

  • YAML
    12 3 4 5 6 7 8 9 10 11 12 13
    #配置/ services.yaml服务#……和以前一样#和以前一样App \资源“. . / src / *”排除“. . / src / {DependencyInjection、实体、测试Kernel.php}’#显式配置服务应用\ \ SiteUpdateManager服务参数adminEmail美元(电子邮件保护)
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
    <!--config/services.xml -->< ?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/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!--...和之前一样,><!--Same as before --><原型名称空间=“应用程序\”资源=“. . / src / *”排除=“. . / src / {DependencyInjection、实体、测试Kernel.php}”/><!--Explicitly configure the service --><服务id =“应用程序服务\ \ SiteUpdateManager”><参数关键=“adminEmail美元”>(电子邮件保护)> < /参数< /服务>> < /服务> < /容器
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    / /配置/ services.php名称空间欧宝娱乐app下载地址Symfony \ DependencyInjection \装载机\ \组件配置器使用应用\ \ SiteUpdateManager服务返回函数ContainerConfigurator美元配置器/ /……//和以前一样美元服务->负载“应用\ \”“. . / src / *”->排除“. . / src / {DependencyInjection、实体、测试Kernel.php}’);美元服务->SiteUpdateManager::->参数“adminEmail美元”(电子邮件保护)};

多亏了这个,容器才会通过manager@example.comadminEmail美元的观点__construct在创建SiteUpdateManager服务。其他参数仍将自动连接。

但是,这不是很脆弱吗?幸运的是,不!如果你重命名adminEmail美元对其他事物的争论。mainEmail美元-你会得到一个明确的异常时,你重新加载下一页(即使该页面不使用此服务)。

服务参数

除了保存服务对象外,容器还保存配置,称为参数.关于Symfony配置的主要文章解释了欧宝娱乐app下载地址配置参数,并显示所有类型(字符串,布尔,数组,二进制和PHP常量参数)。

然而,还有另一种类型的参数与服务相关。在YAML配置中,以被认为是一个服务的ID,而不是一个常规字符串。在XML配置中,使用type = "服务"类型作为参数,在PHP配置中使用服务()功能:

  • YAML
    1 2 3 4 5 6 7 8 9 10 11
    #配置/ services.yaml服务应用\ \ MessageGenerator服务参数#这不是一个字符串,而是一个服务的引用名为'logger'-“@logger”#如果字符串参数的值以“@”开头,则需要转义#它通过添加另一个“@”,所以Symfony不认为它是一个服欧宝娱乐app下载地址务#下面的例子将被解析为字符串'@securepassword'#——“@@securepassword”
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13
    <!--config/services.xml -->< ?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/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id =“应用程序服务\ \ MessageGenerator”><参数类型=“服务”id =“日志”/>< /服务>> < /服务> < /容器
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13
    / /配置/ services.php名称空间欧宝娱乐app下载地址Symfony \ DependencyInjection \装载机\ \组件配置器使用应用\ \ MessageGenerator服务返回函数ContainerConfigurator美元配置器美元服务美元配置器->服务();美元服务->MessageGenerator:://在Symfony 5.1之前的版本中,servi欧宝娱乐app下载地址ce()函数被称为ref()->arg游戏([服务“日志”)))};

使用容器的参数访问器方法来处理容器参数是很简单的:

//检查参数是否定义(参数名区分大小写)美元的容器->hasParameter“mailer.transport”);//获取参数值美元的容器->getParameter“mailer.transport”);//添加一个新的参数美元的容器->setParameter“mailer.transport”“发送邮件”);

谨慎

用过的符号是一个欧宝娱乐app下载地址Symfony公约使参数更容易读取。参数是扁平的键值元素,它们不能被组织到嵌套数组中

请注意

您只能在容器编译之前设置参数,而不能在运行时设置。要了解关于编译容器的更多信息,请参阅编译的容器

选择特定的服务

MessageGenerator前面创建的服务需要LoggerInterface论点:

/ / src /服务/ MessageGenerator.php名称空间App \服务使用Psr \ \ LoggerInterface日志MessageGenerator私人美元记录器公共函数__constructLoggerInterface美元记录器这个美元->日志记录器美元记录器/ /……

然而,有多个实现的容器中的服务LoggerInterface,如日志记录器monolog.logger.requestmonolog.logger.php等。容器如何知道使用哪个?

在这些情况下,容器通常配置为自动选择其中一个服务-日志记录器在这种情况下(阅读更多关于为什么使用别名启用自动装配).但是,你可以控制这个,并传入一个不同的记录器:

  • YAML
    1 2 3 4 5 6 7 8 9 10 11
    #配置/ services.yaml服务#……代码和之前一样#显式配置服务应用\ \ MessageGenerator服务参数# @符号很重要:它告诉容器#你想传递id为'monolog.logger.request'的*service*,#而不仅仅是*string* 'monolog.logger.request'美元记录器“@monolog.logger.request”
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    <!--config/services.xml -->< ?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/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!--...代码和之前一样,><!--Explicitly configure the service --><服务id =“应用程序服务\ \ MessageGenerator”><参数关键=“美元记录器”类型=“服务”id =“monolog.logger.request”/>< /服务>> < /服务> < /容器
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13
    / /配置/ services.php名称空间欧宝娱乐app下载地址Symfony \ DependencyInjection \装载机\ \组件配置器使用应用\ \ MessageGenerator服务返回函数ContainerConfigurator美元配置器/ /……代码和之前一样//显式配置服务美元服务->MessageGenerator::->参数“美元记录器”服务“monolog.logger.request”))};

这告诉容器美元记录器参数__construct应该使用id为的服务monolog.logger.request

完整的列表所有容器中可能存在的服务,运行:

1
php bin /控制台调试:容器

按名称或类型绑定参数

也可以使用绑定关键字按名称或类型绑定特定参数:

  • YAML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
    #配置/ services.yaml服务_defaults绑定#将此值传递给任何服务的$adminEmail参数#定义在这个文件中(包括控制器参数)adminEmail美元(电子邮件保护)#将此服务传递给任何$requestLogger参数在这个文件中定义的服务requestLogger美元“@monolog.logger.request”#为任何LoggerInterface提供type-hint在这个文件中定义的服务Psr \ \ LoggerInterface日志“@monolog.logger.request”#可以选择定义参数的名称和类型来匹配字符串adminEmail美元(电子邮件保护)Psr \ Log \ LoggerInterface requestLogger美元“@monolog.logger.request”iterable美元规则tagged_iterator !app.foo.rule#……
  • XML
    12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
    <!--config/services.xml -->< ?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/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><违约自动装配=“真正的”可以使用autoconfigure =“真正的”公共=“假”><绑定关键=“adminEmail美元”>(电子邮件保护)< / >绑定<绑定关键=“requestLogger美元”类型=“服务”id =“monolog.logger.request”/><绑定关键=“Psr \ Log \ LoggerInterface”类型=“服务”id =“monolog.logger.request”/><!--optionally you can define both the name and type of the argument to match --><绑定关键=“弦adminEmail美元”>(电子邮件保护)< / >绑定<绑定关键=“Psr \ Log \ LoggerInterface requestLogger美元”类型=“服务”id =“monolog.logger.request”/><绑定关键=“美元iterable规则”类型=“tagged_iterator”标签=“app.foo.rule”/>> < /违约<!--...-->> < /服务> < /容器
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    / /配置/ services.php名称空间欧宝娱乐app下载地址Symfony \ DependencyInjection \装载机\ \组件配置器使用应用程序控制器\ \ LuckyController使用Psr \ \ LoggerInterface日志使用欧宝娱乐app下载地址Symfony \ DependencyInjection \ \组件定义使用欧宝娱乐app下载地址Symfony \ DependencyInjection \ \组件参考返回函数ContainerConfigurator美元配置器美元服务美元配置器->服务()->违约()//将此值传递给任何服务的$adminEmail参数//在这个文件中定义(包括控制器参数)->绑定“adminEmail美元”(电子邮件保护)//将此服务传递给任何$requestLogger参数//在文件中定义的服务->绑定“requestLogger美元”服务“monolog.logger.request”))//为任何LoggerInterface传递这个服务//在文件中定义的服务->绑定LoggerInterface::服务“monolog.logger.request”))//可以选择定义参数的名称和类型来匹配->绑定“弦adminEmail美元”(电子邮件保护)->绑定LoggerInterface::“requestLogger美元”服务“monolog.logger.request”))->绑定“美元iterable规则”tagged_iterator“app.foo.rule”))/ /……};

通过将绑定关键在_defaults,可以指定的值任何理由任何服务定义在这个文件!你可以通过名称来绑定参数。adminEmail美元),按类型(例如:Psr \ \ LoggerInterface日志或两者都有。Psr \ \ LoggerInterface日志requestLogger美元).

绑定Config也可以应用于特定的服务,或者一次加载多个服务(例如:通过资源一次性导入多个服务).

自动装配选项

以上,services.yaml文件自动装配:真正的_defaults节,以便将其应用于该文件中定义的所有服务。控件中的类型提示参数__construct ()方法,容器将自动向您传递正确的参数。这整个条目都是围绕自动装配而写的。

有关自动装配的更多细节,请查看自动定义服务依赖关系

可以使用autoconfigure选项

以上,services.yaml文件可以使用autoconfigure:真正的_defaults节,以便将其应用于该文件中定义的所有服务。使用此设置,容器将根据服务的配置自动将某些配置应用到您的服务.这是最常用的自动标记你的服务。

例如,要创建一个Twig扩展,您需要创建一个类,将其注册为服务,并且标签它与twig.extension

但是,与可以使用autoconfigure:真正的,你不需要标签。事实上,如果你用默认的服务。yaml配置,你不需要这样做任何东西:表示服务自动加载。然后,可以使用autoconfigure将添加twig.extension标签你,因为你的类实现树枝\ \ ExtensionInterface延伸.感谢自动装配,你甚至可以添加构造函数参数而不需要任何配置。

产品毛羽服务定义

线头:容器命令检查注入到服务中的参数是否与它们的类型声明匹配。在将你的应用部署到生产环境之前运行它是很有用的(例如在你的持续集成服务器中):

1
php bin /控制台线头:容器

在编译容器时检查所有服务参数的类型可能会损害性能。这就是为什么类型检查在编译器通过被称为CheckTypeDeclarationsPass默认禁用,仅在执行线头:容器命令。如果您不介意性能损失,可以在应用程序中启用编译器传递。

公共服务与私人服务

默认情况下,定义的每个服务都是私有的。当服务是私有的,您不能直接从容器使用集装箱- > get ().作为最佳实践,您应该只创建私人你应该使用依赖注入来获取服务而不是使用集装箱- > get ()

如果您需要惰性地获取服务,那么您应该考虑使用服务定位器

但是,如果你需要将服务公开,重写公共设置:

  • YAML
    1 2 3 4 5 6 7
    #配置/ services.yaml服务#……代码和之前一样#显式配置服务应用\ \ PublicService服务公共真正的
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14
    <!--config/services.xml -->< ?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/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!--...代码和之前一样,><!--Explicitly configure the service --><服务id =“应用程序服务\ \ PublicService”公共=“真正的”> < /服务>> < /服务> < /容器
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13
    / /配置/ services.php名称空间欧宝娱乐app下载地址Symfony \ DependencyInjection \装载机\ \组件配置器使用应用\ \ PublicService服务返回函数ContainerConfigurator美元配置器/ /……与前面的代码相同//显式配置服务美元服务->服务\ PublicService::->公共()};

5.1版后已移除:从Symfo欧宝娱乐app下载地址ny 5.1开始,不再可能通过类型提示自动装配服务容器Psr \ \ ContainerInterface容器

通过资源一次性导入多个服务

控件可以一次导入多个服务资源关键。例如,默认的Symfony配置包含以下内容:欧宝娱乐app下载地址

  • YAML
    1 2 3 4 5 6 7 8 9
    #配置/ services.yaml服务#……和以前一样#使src/中的类可以作为服务使用#这将为每个id为完全限定类名的类创建一个服务App \资源“. . / src / *”排除“. . / src / {DependencyInjection、实体、测试Kernel.php}’
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13
    <!--config/services.xml -->< ?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/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!--...和之前一样,><原型名称空间=“应用程序\”资源=“. . / src / *”排除=“. . / src / {DependencyInjection、实体、测试Kernel.php}”/>> < /服务> < /容器
  • PHP
    1 2 3 4 5 6 7 8 9 10 11
    / /配置/ services.php名称空间欧宝娱乐app下载地址Symfony \ DependencyInjection \装载机\ \组件配置器返回函数ContainerConfigurator美元配置器/ /……//使src/中的类可以作为服务使用//为每个类创建一个服务,它的id是完全限定的类名美元服务->负载“应用\ \”“. . / src / *”->排除“. . / src / {DependencyInjection、实体、测试Kernel.php}’);};

提示

的价值资源排除选项可以是任何有效的一团模式

这可以用于快速将许多类作为服务提供,并应用一些默认配置。的id每个服务的完全限定类名。你可以使用下面的id(类名)来覆盖任何导入的服务(例如,参见手动布线参数).如果你覆盖了一个服务,没有一个选项(例如。公共)继承自导入(但被覆盖的服务还是继承_defaults).

你也可以排除特定的路径。这是可选的,但会略微提高性能dev环境:被排除的路径不会被跟踪,因此修改它们不会导致容器重新构建。

请注意

等等,这是不是意味着每一个src /是否注册为服务?甚至模型类?事实上,没有。只要您将导入的服务保持为私人,中的所有类src /这是显式地作为服务使用将自动从最终容器中删除。实际上,导入意味着所有类都是“可用的”使用作为服务,不需要手动配置。

使用相同命名空间的多个服务定义

如果你使用YAML配置格式定义服务,PHP命名空间被用作每个配置的键,所以你不能为同一个命名空间下的类定义不同的服务配置:

  • YAML
    1 2 3 4 5
    #配置/ services.yaml服务应用程序域\ \资源“. . / src /域/ *”#……
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14
    <!--config/services.xml -->< ?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/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><原型名称空间=“应用程序域\”资源=“. . / src / App /域/ *”/><!--...-->> < /服务> < /容器
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13
    / /配置/ services.php使用欧宝娱乐app下载地址Symfony \ DependencyInjection \ \组件定义美元的违约定义();// this是对当前加载器的引用这个美元->registerClasses美元的违约“应用程序域\ \ \ \”“. . / src / App /域/ *’);/ /……

为具有多个定义,请添加名称空间选项并使用任何唯一的字符串作为每个服务配置键:

1 2 3 4 5 6 7 8 9 10 11
#配置/ services.yaml服务command_handlers名称空间应用程序域\ \资源“. . / src /域/ * / CommandHandler '标签command_handlerevent_subscribers名称空间应用程序域\ \资源“. . / src /域/ * / EventSubscriber '标签event_subscriber

显式配置服务和参数

在Symfony 欧宝娱乐app下载地址3.3之前,所有服务和(通常)参数都是显式配置的:这是不可能的负载自动服务自动装配不太常见。

这两个特性都是可选的。即使您使用它们,也可能在某些情况下需要手动连接服务。例如,假设您想要注册2服务SiteUpdateManager类——每个类都有不同的管理电子邮件。在这种情况下,每个服务都需要有一个唯一的服务id:

  • YAML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
    #配置/ services.yaml服务#……#这是服务idsite_update_manager.superadmin应用\ \ SiteUpdateManager服务#你仍然可以使用自动装配:我们只是想展示它看起来像没有自动装配#手动连接所有参数参数-“@App \ \ MessageGenerator服务”-“@mailer”-(电子邮件保护)site_update_manager.normal_users应用\ \ SiteUpdateManager服务自动装配参数-“@App \ \ MessageGenerator服务”-“@mailer”-(电子邮件保护)#创建一个别名,默认情况下,如果你键入提示SiteUpdateManager,# site_update_manager。超级管理员应用\ \ SiteUpdateManager服务“@site_update_manager.superadmin”
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    <!--config/services.xml -->< ?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/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!--...--><服务id =“site_update_manager.superadmin”类=“应用程序服务\ \ SiteUpdateManager”自动装配=“假”><参数类型=“服务”id =“应用程序服务\ \ MessageGenerator”/><参数类型=“服务”id =“梅勒”/><参数>(电子邮件保护)> < /参数< /服务><服务id =“site_update_manager.normal_users”类=“应用程序服务\ \ SiteUpdateManager”自动装配=“假”><参数类型=“服务”id =“应用程序服务\ \ MessageGenerator”/><参数类型=“服务”id =“梅勒”/><参数>(电子邮件保护)> < /参数< /服务><服务id =“应用程序服务\ \ SiteUpdateManager”别名=“site_update_manager.superadmin”/>> < /服务> < /容器
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
    / /配置/ services.php名称空间欧宝娱乐app下载地址Symfony \ DependencyInjection \装载机\ \组件配置器使用应用\ \ MessageGenerator服务使用应用\ \ SiteUpdateManager服务返回函数ContainerConfigurator美元配置器/ /……/ / site_update_manager。“超级管理员”是服务的id美元服务->“site_update_manager.superadmin”SiteUpdateManager:://你仍然可以使用自动装配:我们只是想展示它看起来像没有->自动装配//手动连接所有参数->arg游戏([服务MessageGenerator::),服务“梅勒”),(电子邮件保护)]);美元服务->“site_update_manager.normal_users”SiteUpdateManager::->自动装配->arg游戏([服务MessageGenerator::),服务“梅勒”),(电子邮件保护)]);//创建一个别名,默认情况下,如果你键入提示SiteUpdateManager,/ / site_update_manager。超级管理员美元服务->别名SiteUpdateManager::“site_update_manager.superadmin”);};

在这种情况下,两个服务注册:site_update_manager.superadminsite_update_manager.normal_users.多亏了别名,如果你输入提示SiteUpdateManager第一个(site_update_manager.superadmin)将通过。如果你想通过第二关,你就得手动连接服务

谨慎

如果你做创建别名和are从src/中加载所有服务,然后三个服务已经创建(自动服务+你的两个服务),自动加载的服务将被传递-默认情况下-当你键入提示SiteUpdateManager.这就是为什么创建别名是个好主意。

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