【问题标题】:Symfony2 how to get entity manager in ListenerSymfony2如何在Listener中获取实体管理器
【发布时间】:2014-12-10 03:13:15
【问题描述】:

我正在尝试使用学说将数据插入到 onKernelRequest 中的数据库中

//** src/MPN/CRMBundle/Listener/AnalyticsListener.php
namespace MPN\CRMBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use MPN\CRMBundle\Manager\AnalyticsManager;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\ORM\EntityManager;
use vRonn\StatisticsBundle\Entity\Statistics as Statistics;

class AnalyticsListener
{
    /**
     * @var AnalyticsManager
     */
    private $am;

    private $em;

    public function __construct(AnalyticsManager $am)
    {
        $this->am = $am;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if (!$event->isMasterRequest()) {
            return;
        }

        $request    = $event->getRequest();
        $session    = $request->getSession();
        $uri        = $request->getRequestUri();
        $route      = $request->get('_route');
        if (!preg_match('@^/(app_dev\.php/)?(admin|js|media|_[^/]+)/?.*@', $uri)) {
            // add page view count
            $this->am->addPageView();

            //Here is how i try to insert data
            $d = new Statistics();
            $d->setType(1);
            $d->setName('blabla');
            $d->setValue('val');

            $em = $this->am->em->getRepository('vRonnStatisticsBundle:Statistics');
            $em->persist($d);
            $em->flush();

            if (!$session->has('visitor') || $session->get('visitor') < time()) {
                $session->set('visitor', time() + (24 * 60 * 60));
                $this->am->addVisitor();
            }
            $this->am->save();
     }
}

但我在下面得到错误

未定义的方法'persist'。方法名称必须以 findBy 或 findOneBy!

这是我从中获取实体管理器的管理器,我从这里获取实体是因为我尝试了 $this->get('doctrine')$this->getDoctrine () 里面 onKernelRequest 但错误

//** src/MPN/CRMBundle/Manager/AnalyticsManager.php
namespace MPN\CRMBundle\Manager;

use Doctrine\ORM\EntityManager;
use MPN\CRMBundle\Entity\Analytics;
use MPN\CRMBundle\Service\DateTimeBuilder;

class AnalyticsManager
{
    /**
     * @var EntityManager
     */
    public $em;

    /**
     * @var DateTimeBuilder
     */
    private $dateTimeBuilder;

    /**
     * @var array
     */
    private $analytics;

    public function __construct(EntityManager $em, DateTimeBuilder $dateTimeBuilder)
    {
        $this->em = $em;
        $this->dateTimeBuilder = $dateTimeBuilder;
        $this->setup();
    }

    /**
     * Flushes the data to the database.
     *
     * @return void
     */
    public function save()
    {
        $this->em->flush();
    }
}

【问题讨论】:

    标签: php symfony doctrine


    【解决方案1】:

    您似乎将$em 设置为存储库,而不是实体管理器。如果你只是做$em = $this-&gt;am-&gt;em 它应该可以工作。

    【讨论】:

    • ic,它工作,谢谢。但除了从 $this->am->em 中获取 em 之外,没有其他方法可以获取 em 吗?像 $this->get('doctrine')->bla 像在控制器中一样?
    • 如果你在配置文件(例如 config.yml)的服务部分设置你的监听器,你应该能够将“@doctrine”传递给你传入的构造函数您的 AnalyticsManager 来专门获取原则,或者您可以传递“@service_container”来获取传递给控制器​​的整个服务容器。一般情况下,最好更具体地传递您需要的内容。
    • 注意:你必须改变你的班级才能收到你通过的任何东西
    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2014-07-22
    • 2011-07-08
    • 2012-08-13
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多