Symfony 2调用不存在的服务" router"

时间:2014-07-23 07:22:19

标签: php symfony

我有一个服务MailController,在我的配置

中定义如下
services:
    mail_controller:
        class: Company\Project\Bundle\Controller\MailController

我在其他服务中调用服务

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

现在我得到的错误是在this Question

上累积

未在控制器上设置container,因此我在constructor

中注入一个
// MailController    
public function __construct() {
    $this->setContainer(new Container());
}

现在我收到了这个错误:

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

我猜我需要注入更多服务,但我不知道要注入什么,所以我需要进一步添加什么才能使我的Controller可以使用所有服务?

我的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

}

2 个答案:

答案 0 :(得分:1)

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

要使用您的控制器,您需要通过您的服务将预制的服务容器注入您的控制器中。

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

..并摆脱__construct中的二传手。

答案 1 :(得分:1)

注入整个服务容器

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
瞧,瞧, 只需要一项服务,只注入一项服务。 如果您发现自己在一个动作中注入了太多服务,那么您的动作/控制器可能并不“瘦”。够了。