Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 将条令存储库注入控制器_Symfony_Service_Dependency Injection_Controller_Repository - Fatal编程技术网

Symfony 将条令存储库注入控制器

Symfony 将条令存储库注入控制器,symfony,service,dependency-injection,controller,repository,Symfony,Service,Dependency Injection,Controller,Repository,我有以下控制器: <?php namespace AppBundle\Controller; use AppBundle\Controller\BaseController; use Symfony\Component\HttpFoundation\Request; class UserController extends BaseController { public function allAction(Request $request) { $

我有以下控制器:

<?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);
    } 
}
class UserController extends BaseController 
{
private $userrepository;
private $container;

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

我一直面临以下错误:

PHP致命错误:第350行的/Applications/MAMP/htdocs/api/vendor/symfony/symfony/src/symfony/Bundle/FrameworkBundle/Controller/Controller.PHP中的非对象上调用成员函数get

第350行

所以我猜控制器不再是“ContainerWare”之类的东西了

但我似乎无法理解这一点


我正在使用symfony 2.7

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

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

services:
    usercontroller:
        class: AppBundle\Controller\UserController
        calls: 
            - [setContainer, ["@service_container"]]
        arguments:
            - "@userrepository"
如果未扩展Symfony控制器,请将容器作为参数注入:

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

<?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);
    } 
}
class UserController extends BaseController 
{
private $userrepository;
private $container;

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

不建议只注入您想要的内容,例如,如果您在controller only存储库中使用,而mailer只注入它们,而不是整个容器。

嘿,谢谢您的帮助,我扩展的BaseController实际上是FOSRestController的扩展,我在其中创建了一个公共方法$this->respond,以方便我一次又一次地做出响应。我看到你说不建议注射整个容器。我想我会做些可疑的事。那么哪种方式更合适呢?由于我来自Laravel的背景,我习惯于将具体类绑定到接口,并以这种方式将它们注入控制器。我不确定我是否理解,但您可以从这些类中创建服务,然后注入它们,只注入您需要的内容,或者干脆不将控制器作为服务,如果您多次使用存储库,只需调用您创建的服务$this->get'userrepository'->findAll即可
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;
}