好的,我有ZF2的背景,但Symfony 2对我来说似乎有点奇怪...... 关于服务我的问题:
应该服务是全球性的。为什么只能从控制器访问它们? 我们假设我有这样的事情:
src/Acme/AcmeBundle
/Acme/SomeClass.php
如何从SomeClass.php访问Container服务(即:$ this-> get / $ this-> container)?
答案 0 :(得分:3)
除非你有充分的理由这样做(非常罕见的情况),否则你根本不应该直接使用容器。从控制器内部访问容器只是为了方便,但我仍然认为这是一种不好的做法。
在大多数情况下,您应该将自定义类注册为服务,并依赖于框架,第三方软件包或您自己提供的特定服务:
// your service
namespace Acme;
class SomeClass {
private $serviceA;
private $serviceB;
private $param;
public function __construct(A $serviceA, B $serviceB, $param = 0) {
$this->serviceA = $serviceA;
$this->serviceB = $serviceB;
$this->param = $param;
}
public function doSth() {
// ...
}
}
// service definition for container
<service id="my_service" class="Acme\SomeClass">
<argument type="service" id="some_service_a" />
<argument type="service" id="some_service_b" />
<argument>123</argument>
</service>
答案 1 :(得分:0)
您必须使用依赖注入。假设你有一个类src / Acme / AcmeBundle / SomeClass.php而不是setContainer函数
<?php
namespace Acme\AcmeBundle;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class SomeClass implements ContainerAwareInterface
{
/**
*
* @var ContainerInterface
*/
protected $container;
/**
* Sets the Container associated with this Controller.
*
* @param ContainerInterface $container A ContainerInterface instance
*/
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
....
}
现在你可以定义&#34; SomeClass&#34;作为服务并注入这样的服务容器。
<service id="some.service.id" class="Acme\AcmeBundle\SomeClass">
<call method="setContainer">
<argument type="service" id="service_container"/>
</call>
</service>
之后&#34; SomeClass&#34;可以通过服务容器访问&#34; some.service.id&#34;并将服务容器注入其中。
答案 2 :(得分:0)
几周前,我写了一篇关于如何注入服务容器的帖子。
链接: - http://anjanasilva.com/blog/injecting-services-in-symfony-2/
顺便说一下,小心使用注入服务容器可能不是最佳方法。
希望这会有所帮助 此致