服务容器

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.7,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

服务容器

您的应用程序完整的有用的对象:一个“梅勒”对象可能帮助你提供电子邮件消息的同时,另一个对象可能会帮助你保存到数据库中。几乎一切应用程序“确实”实际上是由这些对象之一。每一次你安装一个新的包,你获得更多!

在Sy欧宝娱乐app下载地址mfony中,这些被称为有用的对象服务和每个服务的生活在一个非常特殊的对象称为服务容器。如果你有服务容器,那么您可以获取服务,通过该服务的id:

1 2
美元日志记录器=美元容器- >get (“日志”);美元entityManager=美元容器- >get (“doctrine.orm.entity_manager”);

容器是Sym欧宝娱乐app下载地址fony:它允许您标准化和集中的方式构造对象。它使你的生活更容易,是超级快,强调架构促进重用和分离的代码。这也是一个大原因,Symfony如此快速和可扩展的!欧宝娱乐app下载地址

最后,配置和使用服务容器很容易。通过本文的结尾,您能舒适地通过容器创建自己的对象和定制对象从任何第三方包。你会写代码更可重用、可测试的解耦,仅仅因为服务容器使编写好的代码那么简单。

获取和使用服务

当你开始一个Symfony应用,容器欧宝娱乐app下载地址已经包含了许多服务。这些都是像工具,等待着你去利用它们。在控制器中,您可以访问容器通过$ this - >容器。想要日志什么东西吗?没有问题:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src / AppBundle /控制器/ ProductController.php名称空间AppBundle\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;ProductController扩展控制器{/ * * *@Route(“产品”)* /公共函数listAction(){美元日志记录器=美元- >容器- >get (“日志”);美元日志记录器- >信息(“看!我只是使用一个服务”);/ /……}}

日志记录器是一个独特的关键日志记录器对象。提供哪些服务?发现通过运行:

1
美元php应用程序/控制台调试:容器

这只是一个示例的输出:

服务ID 类名
学说 学说\包\ DoctrineBundle \注册表
文件系统 欧宝娱乐app下载地址Symfony \文件系统组件\ \文件系统
form.factory 欧宝娱乐app下载地址Symfony \组件\ \ FormFactory形式
日志记录器 欧宝娱乐app下载地址Symfony \ \独白\记录器的桥梁
request_stack 欧宝娱乐app下载地址Symfony \ \ HttpFoundation \ RequestStack组件
路由器 欧宝娱乐app下载地址\包\ FrameworkBundle\路由\路由器
security.authorization_checker 欧宝娱乐app下载地址\组件\安全\核心\授权\ AuthorizationChecker
security.password_encoder 欧宝娱乐app下载地址\组件\安全\核心\编码器\ UserPasswordEncoder
会话 欧宝娱乐app下载地址\组件\ HttpFoundation\会话\会话
翻译 欧宝娱乐app下载地址Symfony \ \翻译\ DataCollectorTranslator组件
嫩枝 Twig_Environment
验证器 欧宝娱乐app下载地址\组件\验证器\验证器\ ValidatorInterface

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

如果容器有着如此多有用的对象(服务),这是否意味着这些对象实例化每一个请求吗?不!容器是懒惰:它才实例化一个服务(除非)你问。例如,如果你从来没有使用验证器服务请求时,容器不会实例化它。

创建/配置服务的容器

您还可以利用容器来组织你的自己的代码服务。例如,假设你想向您的用户显示一个随机,快乐消息每次他们做点什么。如果你把这段代码在你的控制器,它不能被重用。相反,您决定创建一个新类:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src / AppBundle /服务/ MessageGenerator.php名称空间AppBundle\服务;MessageGenerator{公共函数getHappyMessage(){美元消息= (“你做到了!你更新系统!神奇的!”,这是最酷的更新我\ ' ve整天看到!”,“伟大的工作!继续前进!”,);美元指数=(用于美元消息);返回美元消息(美元指数];}}

恭喜你!你刚刚创建的第一个服务类。接下来,您可以服务容器如何实例化:

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / services.yml服务:app.message_generator:类:AppBundle \ \ MessageGenerator服务参数:[]

就是这样!您的服务——唯一键app.message_generator——现在可以在容器中。你可以用它立即内部控制器:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
公共函数newAction(){/ /……/ /容器实例化一个新的MessageGenerator ()美元messageGenerator=美元- >容器- >get (“app.message_generator”);/ /或使用这个短的语法/ / $ messageGenerator = $ this - > (“app.message_generator”);美元消息=美元messageGenerator- >getHappyMessage ();美元- >addFlash (“成功”,美元消息);/ /……}

当你问的app.message_generator服务,构造一个新的容器MessageGenerator对象,并返回该对象。如果你从来没有要求app.message_generator服务请求时,它的从来没有构造,你节省内存和提高应用程序的速度。这也意味着,几乎是没有定义的服务性能开销。

作为奖励,app.message_generator只有创建服务一次:返回相同的实例每次询问。

注入服务/配置服务

如果你想使用什么日志记录器从内部服务MessageGenerator吗?你的服务有一个$ this - >容器性能:这是一个特殊的权力只有控制器。

相反,您应该创建一个__construct ()方法,添加一个美元记录器参数和设置它美元记录器属性:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ / src / AppBundle /服务/ MessageGenerator.php/ /……使用Psr\日志\LoggerInterface;MessageGenerator{私人美元日志记录器;公共函数__construct(LoggerInterface美元日志记录器){美元- >记录器=美元日志记录器;}公共函数getHappyMessage(){美元- >日志记录器- >信息(要找到一个快乐的消息!”);/ /……}}

提示

LoggerInterfacetype-hint在__construct ()方法是可选的,但一个好主意。你可以找到正确的通过阅读文档type-hint服务或通过使用php应用程序/控制台调试:容器控制台命令。

接下来,告诉容器服务有一个构造函数参数:

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / services.yml服务:app.message_generator:类:AppBundle \ \ MessageGenerator服务参数:(“@logger”)

就是这样!容器现在知道通过日志记录器服务实例化时作为参数MessageGenerator。这被称为依赖注入。

参数关键是所有构造函数参数的数组到服务(1到目前为止)。的@符号之前@logger很重要:它告诉Symfony通过吗欧宝娱乐app下载地址服务命名日志记录器

但是你可以通过任何作为参数。例如,假设你想让你的课堂更可配置:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src / AppBundle /服务/ MessageGenerator.php/ /……使用Psr\日志\LoggerInterface;MessageGenerator{私人美元日志记录器;私人美元loggingEnabled;公共函数__construct(LoggerInterface美元日志记录器,美元loggingEnabled){美元- >记录器=美元日志记录器;美元- >loggingEnabled =美元loggingEnabled;}公共函数getHappyMessage(){如果(美元- >loggingEnabled) {美元- >日志记录器- >信息(要找到一个快乐的消息!”);}/ /……}}

现在的类第二个构造函数参数。没有问题,只是更新服务配置:

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / services.yml服务:app.message_generator:类:AppBundle \ \ MessageGenerator服务参数:[' @logger ',真正的]

你甚至可以利用环境控制这个新值在不同的情况下。

服务参数

除了服务对象,容器还拥有配置,叫做参数。创建一个参数,添加它参数关键和引用它% parameter_name %语法:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
# app / config / services.yml参数:enable_generator_logging:真正的服务:app.message_generator:类:AppBundle \ \ MessageGenerator服务参数:[' @logger ',“% enable_generator_logging %”]

事实上,一旦你定义一个参数,它可以通过引用% parameter_name %语法在任何——像其他服务配置文件config.yml。许多参数定义在一个参数。yml文件

然后您可以获取参数在服务:

1 2 3 4 5 6 7 8 9 10 11
SiteUpdateManager{/ /……私人美元adminEmail;公共函数__construct(美元adminEmail){美元- >adminEmail =美元adminEmail;}}

你还可以直接从容器中获取参数:

1 2 3 4 5 6 7 8
公共函数newAction(){/ /……美元isLoggingEnabled=美元- >容器- >getParameter (“enable_generator_logging”);/ /……}

请注意

如果你使用一个字符串,该字符串开始的@%通过添加另一个,你需要逃离它@%:

1 2 3 4 5 6 7
# app / config / parameters.yml参数:#这将被解析为字符串“@securepass”mailer_password:“@@securepass”像//www.oldmanjams.com欧宝娱乐app下载地址/?foo=%s& #解析;酒吧= % durl_pattern:“http://欧宝娱乐app下载地址www.oldmanjams.com/?foo=%%s&酒吧= % % d '

关于参数的更多信息,请参阅介绍了参数

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。