在控制器中,我可以做到
$this->get('service.name')
但是在自定义课程中,我该怎么做?
答案 0 :(得分:26)
将自定义类定义为服务,然后将依赖项注入其中。
例如:
// services.yml
services:
my.custom.service.id:
class: My\Custom\Class
arguments:
- @service.name
- @doctrine.orm.entity_manager
然后,您的自定义类构造函数会将这些服务作为参数获取。
请务必阅读官方文档中的服务容器。它非常详细地讨论了所有这些。
答案 1 :(得分:8)
您使用ContainerAware进入了正确的轨道。
$this->get('id')
实际上是$this->container->get('id')
的快捷方式。将容器放入您的班级就像实施ContainerAwareInterface
一样简单 - 将此片段放入您的班级:
public function setContainer(\Symfony\Component\DependencyInjection\ContainerInterface $container = null)
{
$this->container = $container;
}
答案 2 :(得分:0)
如果您不知道创建服务时所需的完整依赖项列表,则可以将容器作为参数传递http://symfony.com/doc/current/book/service_container.html#using-the-expression-language
services:
service_name:
class: AppBundle\Class
arguments: ['@=container']
答案 3 :(得分:-2)
这不是最好的做法,但它有效。如果您的自定义类未设置为服务,则可以使用全局变量$ kernel:
访问服务容器class Helper {
private $container;
/**
* Constructor assigns service container to private container.
*/
public function __construct() {
global $kernel;
$this->container = $kernel->getContainer();
}
function doSOmething() {
$someService = $this->container->get('service.name');
// do something with someService ...
}
}
答案 4 :(得分:-3)
好的,我想@Arms的回答是一个可能的解决方案,我通过查看Controller
的来源找到了,我可以扩展ContainerAware