Symfony2 - 可捕获的致命错误:_construct()必须是Doctrine\ORM\EntityManager的实例

3
我正在构建“最后登录”的功能。创建activitylistener并将其定义为服务后,我遇到了一个错误。

ContextErrorException: Catchable Fatal Error:在C:\ xampp \ htdocs \ sinfoc \ public \ app \ cache \ dev \ appDevDebugProjectContainer.php的第350行调用给定的Doctrine\Bundle\DoctrineBundle\Registry实例时,传递给Acme\SecurityBundle\EventListener\ActivityListener :: __ construct()的第二个参数必须是Doctrine\ORM\EntityManager的实例,并在C:\ xampp \ htdocs \ sinfoc \ public \ src \ Acme \ SecurityBundle \ EventListener \ ActivityListener.php的第22行中进行定义

以下是我的ActivityListener类。
 public function __construct(SecurityContext $securityContext, EntityManager $entityManager)
        {
            $this->securityContext = $securityContext;
            $this->entityManager = $entityManager;
        }

下面是 listener 定义为服务的 services.yml 文件:
services:
    activity_listener:
        class: Bnpp\SecurityBundle\EventListener\ActivityListener
        arguments: [@security.context, @doctrine.orm.entity_manager]
        tags:
        - { name: kernel.event_listener, event: kernel.controller, method: onCoreController }

这里是完整的ActivityListenerClass

 <?php

namespace Bnpp\SecurityBundle\EventListener;

use Doctrine\ORM\EntityManager;
//use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\HttpKernel;
use Bnpp\SecurityBundle\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Registry;


/**
 * Listener that updates the last activity of the authenticated user
 */

class ActivityListener

    {
    protected $securityContext;
    protected $entityManager;

    public function __construct(SecurityContext $securityContext, EntityManager $entityManager)
    {
        $this->securityContext = $securityContext;
        $this->entityManager = $entityManager;
    }



    /**
     * Update the user "lastActivity" on each request
     * @param FilterControllerEvent $event
     */


    public function onCoreController(FilterControllerEvent $event)
    {

        // Check that the current request is a "MASTER_REQUEST"
        // Ignore any sub-request
        if ($event->getRequestType() !== HttpKernel::MASTER_REQUEST) {
            return;
        }

        // Check token authentication availability
        if ($this->securityContext->getToken()) {
            $user = $this->securityContext->getToken()->getUser();


            if ( ($user instanceof User) && !($user->isActiveNow()) ) {
                $user->setLastActivity(new \DateTime('now'));
                $this->entityManager->flush($user);
            }
        }

    }

}

@PéCé 刚刚添加了完整的错误信息和类声明。 - StarJedi
1
刷新缓存,似乎 ActivityListener 接收到第二个参数时是“@doctrine”而不是“@doctrine.orm.entity_manager”。 - AlterPHP
@PéCé清除了缓存。但错误仍然存在。 - StarJedi
尝试使用 doctrine.orm.default_entity_manager。另外一个问题是 - 您正在使用哪个版本的Symfony? - Touki
@Touki 我试过doctrine.orm.default_entity_manager但是没有成功。我正在使用Symfony 2.3。 - StarJedi
显示剩余5条评论
1个回答

0

从这个错误中

ContextErrorException: Catchable Fatal Error: Argument 2 passed to Acme\SecurityBundle\EventListener\ActivityListener::__construct() must be an instance of Doctrine\ORM\EntityManager, instance of Doctrine\Bundle\DoctrineBundle\Registry given, called in C:\xampp\htdocs\sinfoc\public\app\cache\dev\appDevDebugProjectContainer.php on line 350 and defined in C:\xampp\htdocs\sinfoc\public\src\Acme\SecurityBundle\EventListener\ActivityListener.php line 22

你需要提供的是

Doctrine\ORM\EntityManager,

但你提供的是

Doctrine\Bundle\DoctrineBundle\Registry

 arguments: [@security.context, @doctrine.orm.entity_manager]

你的参数应该是

arguments:
         - "@security.context"
         - "@doctrine.orm.entity_manager"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接