好吧,我有ZF2的背景,但Symfony 2似乎对我来说有点奇怪…我的问题是关于服务:
服务应该是全局的。为什么它们只能从控制器访问?我们假设我有这样的东西:
src/Acme/AcmeBundle
/Acme/SomeClass.php
如何从someeclass .php访问容器服务(即:$this->get/$this-> Container) ?
除非有很好的理由这样做(非常罕见的情况),否则根本不应该直接使用容器。从控制器内部访问容器只是为了方便,但我仍然认为这是一个不好的做法。
在大多数情况下,你应该将你的自定义类注册为一个服务,它依赖于框架、第三方包或你自己提供的特定服务:
// 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>
你必须使用依赖注入。假设你有一个类src/Acme/AcmeBundle/somecclass .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;
}
....
}
现在你可以将"SomeClass"定义为服务,并像这样注入服务容器。
<service id="some.service.id" class="Acme'AcmeBundle'SomeClass">
<call method="setContainer">
<argument type="service" id="service_container"/>
</call>
</service>
在之后,"SomeClass"可以通过服务容器通过"some.service "访问。
几周前我写了一篇关于如何注入服务容器的文章。
链接:- http://anjanasilva.com/blog/injecting-services-in-symfony-2/
顺便说一下,注入服务容器要小心使用,因为这可能不是最好的方法。
希望这对你有帮助关于