服务容器
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐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下载地址 |
security.authorization_checker | 欧宝娱乐app下载地址 |
security.password_encoder | 欧宝娱乐app下载地址 |
会话 | 欧宝娱乐app下载地址 |
翻译 | 欧宝娱乐app下载地址Symfony \ \翻译\ DataCollectorTranslator组件 |
嫩枝 | Twig_Environment |
验证器 | 欧宝娱乐app下载地址 |
整个文档,您将看到如何使用许多不同的服务的容器。
创建/配置服务的容器
您还可以利用容器来组织你的自己的代码服务。例如,假设你想向您的用户显示一个随机,快乐消息每次他们做点什么。如果你把这段代码在你的控制器,它不能被重用。相反,您决定创建一个新类:
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(){美元这- >日志记录器- >信息(要找到一个快乐的消息!”);/ /……}}
提示
的LoggerInterface
type-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 '
关于参数的更多信息,请参阅介绍了参数。