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;
}