将 Doctrine Repository 注入控制器

Inject Doctrine Repository into controller

我有以下控制器:

<?php

namespace AppBundle\Controller;

use AppBundle\Controller\BaseController;
use Symfony\Component\HttpFoundation\Request;

class UserController extends BaseController 
{
    public function allAction(Request $request)
    {
        $users = $this->getDoctrine()
                      ->getRepository('AppBundle:User')
                      ->findAll();

        return $this->respond(['users' => $users], 200);
    } 
}

我想将存储库注入控制器(用于测试目的)

控制器:

<?php

namespace AppBundle\Controller;

use AppBundle\Controller\BaseController;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\HttpFoundation\Request;

class UserController extends BaseController 
{
    private $userrepository;

    public function __construct(EntityRepository $userrepository)
    {
        $this->userrepository = $userrepository;
    }

    public function allAction(Request $request)
    {
        $users = $this->userrepository->findAll();
        return $this->respond(['users' => $users], 200);
    } 
}

services.yml

services:

    userrepository:
        class: Doctrine\ORM\EntityRepository
        factory_service: doctrine.orm.entity_manager
        factory_method: getRepository
        arguments:
            - AppBundle\Entity\User

    usercontroller:
        class: AppBundle\Controller\UserController
        arguments:
            - "@userrepository"

routing.yml

api_users_all:
    path: /api/users.{_format}
    defaults: { _controller: usercontroller:allAction, _format: json }
    requirements:
        _method: GET

我一直面临以下错误:

PHP 致命错误:在第 350[=42= 行 /Applications/MAMP/htdocs/api/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php 的非对象上调用成员函数 get() ]

第 350 行

return $this->container->get($id);

所以我的猜测是控制器不再是 'ContainerAware' 或类似的东西。

但我似乎想不通。

我正在使用 symfony 2.7

配置路由器通过服务调用控制器后,控制器不是直接创建的,而是从依赖注入容器请求的。是的,不再有容器,因为您只向它注入一个参数:用户存储库。

如果你想要整个容器(不推荐)并且你在你的 BaseController 中扩展 Symfony 控制器,请在你的服务中设置它:

services:
    usercontroller:
        class: AppBundle\Controller\UserController
        calls: 
            - [setContainer, ["@service_container"]]
        arguments:
            - "@userrepository"

如果您不扩展 Symfony 控制器,请将容器作为参数注入:

services:
    usercontroller:
        class: AppBundle\Controller\UserController
        arguments:
            - "@userrepository"
            - "@service_container"

控制器:

class UserController extends BaseController 
{
private $userrepository;
private $container;

public function __construct(EntityRepository $userrepository, $container)
{
    $this->userrepository = $userrepository;
    $this->container = $container;
}

不推荐,只注入你想要的,eg。如果您在控制器中仅使用存储库和邮件程序,则仅注入它们而不是整个容器。