将 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。如果您在控制器中仅使用存储库和邮件程序,则仅注入它们而不是整个容器。
我有以下控制器:
<?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。如果您在控制器中仅使用存储库和邮件程序,则仅注入它们而不是整个容器。