Symfony 2调用不存在的服务" router_quot;


Symfony 2 calling non-existent service "router"

我有一个服务MailController,在我的配置中定义如下

services:
    mail_controller:
        class: Company'Project'Bundle'Controller'MailController

我正在调用其他服务中的Service

$mailController = $this->get('mail_controller');

现在我得到的错误是建立在这个问题

container没有在控制器上设置,所以我在constructor内注入一个

// MailController    
public function __construct() {
    $this->setContainer(new Container());
}

现在我得到这个错误:

You have requested a non-existent service "router".

我猜我需要注入更多的服务,但我不知道要注入什么,所以我需要进一步添加什么以便我的控制器可以与所有服务一起工作?

我的MailController是这样的

namespace Company'Project'Bundle'Controller;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Symfony'Component'DependencyInjection'Container;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Route;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Template;
use Doctrine'ORM'EntityManager;
class MailController extends Controller{
    public function __construct() {
        $this->setContainer(new Container());
    }
    //Code for mailstuff
}

你正在创建一个新的容器,而不是注入已构建的容器,因此它没有服务。

要使用你的控制器,你需要通过你的服务将预先制作好的服务容器注入到你的控制器中,就像这样…

services:
    mail_controller:
        class: Company'Project'Bundle'Controller'MailController
        calls:
            - [ setContainer, [ @service_container ]]

. .并且去掉__construct中的setter

注入整个服务容器

calls: - [ setContainer, [ @service_container ]]

违背了将控制器声明为服务的目的。只需在构造函数中注入所需的服务。构造函数需要将服务作为参数传递,并且不再扩展Controller

//MailController
use Symfony'Component'Routing'RouterInterface; 
class MailController
{
    private $router;
    public function __construct(RouterInterface $router){
        $this->router = $router;
    }
    //actions
}

现在您需要调整您的services.yml并使用描述您需要的服务的参数扩展服务

services:
    mail_controller:
        class: Company'Project'Bundle'Controller'MailController
        arguments:
           - @router

等瞧,只需要一个服务,只注入一个服务。如果你发现自己在一个动作中注入了太多的服务,很可能是你的动作/控制器不够"瘦"。