Pertanyaan Akses ke basis data dalam pendengar di Symfony 2


Kita perlu mengakses informasi basis data dalam pendengar. Kami mengkonfigurasi pendengar dalam service.yml Pendengarnya seperti:

namespace company\MyBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class RequestListener
{
    protected $container;

public function __construct(ContainerInterface $container)
{
    $this->container = $container;
}

public function onKernelRequest(GetResponseEvent $event)
{
...

Bagaimana kita bisa mengakses ke doktrin di fungsi onKernelRequest?

Saya mencoba meluas dari pengontrol dan melakukan:

        $em = $this->getDoctrine()->getEntityManager(); 

dan itu berhasil tetapi saya pikir ini adalah praktik yang buruk.


9
2018-01-11 17:12


asal


Jawaban:


Anda cukup menyuntikkan kontainer layanan. Pertama, ubah konstruktor untuk mendapatkan EntityManager:

use Doctrine\ORM\EntityManager;

class RequestListener {
    protected $em;
    function __construct(EntityManager $em)
    {
        $this->em = $em;
    }
    //...
}

Dan selanjutnya konfigurasikan layanan Anda:

#...
services:
    foo.requestlistener:
        class: %foo.requestlistener.class%
        arguments:
            - @doctrine.orm.entity_manager

27
2018-01-11 19:03



Sepertinya Anda menyuntikkan wadah layanan ke pendengar, sehingga Anda dapat mengakses Doktrin dengan cara ini:

$doctrine = $this->container->get('doctrine');

2
2018-01-11 17:18



Jika kasus penggunaan Anda memungkinkan Anda untuk menggunakan Pendengar Acara Doktrin secara langsung

#services.yml
qis.listener.contractBundleStatusListener:
    class: Acme\AppBundle\EventListener\MyListener
    tags:
        - { name: doctrine.event_listener, event: postPersist }

Anda bisa mendapatkan Manajer Entitas dari LifecycleEventArgs:

<?php

use Doctrine\ORM\Event\LifecycleEventArgs;

class MyListener
{
    public function postPersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof Foo) {
            $entityManager = $args->getEntityManager();

            $entityManager->persist($entity);
            $entityManager->flush();
        }
    }
}

2
2018-03-30 11:24



Saya masih seorang pemula di Symfony, tetapi apakah Anda telah mencoba melewati doctrine layanan ke pendengar Anda bukan dari layanan kontainer?

Bergantian, Anda sudah melewati wadah layanan, jadi harus sesederhana menelepon
$this->container->get('doctrine'). Juga, saya diberitahu di IRC beberapa waktu yang lalu bahwa melewati kontainer layanan biasanya dianggap praktik yang buruk. Lebih baik untuk melewati layanan individual yang Anda butuhkan.


1
2018-01-11 17:20



Saya tidak akan menempatkan logika bisnis kepada pendengar karena hanya untuk mendengarkan acara. Dan bagaimana Anda akan menulis tes untuk pendengar menggunakan doktrin ...

Saya akan menempatkan doktrin mengakses materi ke kelas yang berbeda dan kemudian memanggilnya di pendengar.


0
2018-04-26 09:59