symfony2并自动运行服务

时间:2014-01-20 10:15:32

标签: php symfony frameworks containers

我决定在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中启动内核后自动加载服务?

2 个答案:

答案 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()