我决定在symfony2.4中创建一个服务,可以访问我项目中所有范围内的容器。
所以我创建了一个模型:
namespace Nevec\RaxcidoBundle\Model;
class Base {
public static $container;
public function __construct() {
self::$container = $container;
}
}
并将此模型设置为resources / config / services.yml
中的服务parameters:
nevec_raxcido.core: Nevec\RaxcidoBundle\Model\Base
services:
nevec_raxcido.example:
class: %nevec_raxcido.core%
arguments: [@service_container]
现在,正如您所知,我应该在这样的控制器中调用此服务:
$this->get("nevec_raxcido.example");
但我想自动加载此服务,而无需在控制器中调用上述命令
问题是如何在symfony2中启动内核后自动加载服务?
答案 0 :(得分:2)
我找到了解决方案,似乎我们应该将监听器用于services.yml之类:
parameters:
nevec_raxcido.core: Nevec\RaxcidoBundle\Model\Base
services:
nevec_raxcido.example:
class: %nevec_raxcido.core%
arguments: [@service_container]
tags:
- {name: kernel.event_listener, event: kernel.request, method: onKernelRequest}
和这个模型:
<?php
namespace Nevec\RaxcidoBundle\Model;
class Base{
public static $container;
public function __construct($container) {
self::$container = $container;
}
public function onKernelRequest($event){
return;
}
}
因此您可以使用以下方法访问应用程序的所有范围内的容器:
$container = Model\Base::$container;
答案 1 :(得分:-1)
请不要使用服务容器。使用依赖注入。
class Service {
private $service;
public function __construct(SomeServiceInterface $someService){
$this -> service = $service;
}
}
和yml:
services:
service1:
class: SOMENAMESPACE\Service
arguments: [@service2]
service2:
class: SOMENAMESPACE\SomeService
现在您可以在SOMENAMESPACE \ Service中访问SOMENAMESPACE \ SomeService。您可以通过以下方式在控制器中获取服务:
$this -> get('service1');
让我们说学说是你想要注入的具体服务。
这样做:
class Service {
private $em;
protected function getEm(ObjectManager $em){
$this -> em = $em;
}
}
services:
service1:
class: SOMENAMESPACE\Service
arguments: [@doctrine.orm.entity_manager]
问题的第二部分:如何自动加载?满容易。构建一个“BaseController”并扩展它。
class BaseAppController extends Controller{
private $service;
protected function getService(){
if (!($this -> service instanceof SomeServiceInterface)) $this -> service = $this -> get('service');
return $this -> service;
}
}
通过$ this访问 - &gt;的getService()