【发布时间】:2016-03-20 20:05:21
【问题描述】:
得到以下异常:
Catchable Fatal Error: Argument 1 passed to AppBundle\Controller\AudienceController::__construct() must be an instance of AppBundle\Repository\AudienceRepository, none given, called in /home/eddy/Projects/tm/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php on line 162 and defined
意思是,我使用自定义存储库作为构造函数参数定义了我的控制器,但是存储库从未传递或未创建。我尝试调试到 ControllerResolver 但无济于事。
[services.yml]
services:
app.audience_repository:
class: Doctrine\ORM\EntityRepository
factory: ["@doctrine.orm.entity_manager", getRepository]
arguments:
- AppBundle\Entity\Audience
app.audience_controller:
class: AppBundle\Controller\AudienceController
arguments:
- "@app.audience_repository"
[AppBundle\Controller\AudienceController.php]
class AudienceController extends Controller
{
/**
* @var AudienceRepository
*/
private $repository;
/**
* @param AudienceRepository $repository
*/
public function __construct(AudienceRepository $repository)
{
$this->repository = $repository;
}
[AppBundle\Repository\AudienceRepository]
class AudienceRepository extends EntityRepository
{
public function save(Audience $audience)
{
$this->getEntityManager()->persist($audience);
$this->getEntityManager()->flush();
}
}
[AppBundle\Entity\Audience.php]
/**
* Audience
*
* @ORM\Table(name="audience")
* @ORM\Entity(repositoryClass="AppBundle\Repository\AudienceRepository")
*/
class Audience
我认为这是根据 http://php-and-symfony.matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/ 对 symfony3 的修改(参见 https://stackoverflow.com/a/20348821/30759),应该可以工作,但我不断收到此错误。
Stacktrace:
at ErrorHandler ->handleError ('4096', 'Argument 1 passed to AppBundle\Controller\AudienceController::__construct() must be an instance of AppBundle\Repository\AudienceRepository, none given, called in /home/eddy/Projects/tm/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php on line 162 and defined', '/home/eddy/Projects/tm/src/AppBundle/Controller/AudienceController.php', '23', array())
in src/AppBundle/Controller/AudienceController.php at line 23 +
at AudienceController ->__construct ()
in vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php at line 162 +
at ControllerResolver ->instantiateController ('AppBundle\Controller\AudienceController')
in vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php at line 81 +
at ControllerResolver ->instantiateController ('AppBundle\Controller\AudienceController')
in vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php at line 150 +
at ControllerResolver ->createController ('AppBundle\Controller\AudienceController::newAction')
in vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php at line 73 +
at ControllerResolver ->createController ('AppBundle\Controller\AudienceController::newAction')
in vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php at line 76 +
at ControllerResolver ->getController (object(Request))
in vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/TraceableControllerResolver.php at line 46 +
at TraceableControllerResolver ->getController (object(Request))
in vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php at line 127 +
at HttpKernel ->handleRaw (object(Request), '1')
in vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php at line 62 +
at HttpKernel ->handle (object(Request), '1', true)
in vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php at line 169 +
at Kernel ->handle (object(Request))
in web/app_dev.php at line 30 +
at require ('/home/eddy/Projects/tm/web/app_dev.php')
in vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Resources/config/router_dev.php at line 40 +
非常感谢任何帮助:)
【问题讨论】:
-
你需要告诉你的路由控制器被定义为服务:symfony.com/doc/current/cookbook/controller/service.html。顺便说一句,除非您将 setContainer 添加到控制器服务定义中,否则您将无法使用基本控制器类中的任何辅助方法(如渲染)。
标签: dependency-injection symfony