Symfony 3.4: доступ к доктрине в EventListener - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь получить доступ к доктрине в EventListener, который проверяет таблицу базы данных, если она недействительна, то пользователь будет перенаправлен на страницу конфигурации, где он исправит проблемы!

Тест будет выполняться перед каждым вызовом контроллера, поэтому я буду использовать Event kernel.controller:

[ИЗДАНО: РЕШЕНО, ПРОВЕРКА И ПЕРЕРАБОТКА ВЕРРИ ФАЙН]

<?php

namespace AdminBundle\EventListener;

use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\Session;

class BuildReferencesEventListener
{
    /**
     * @var EntityManager
     */
    protected $em;
    /**
     * @var Router
     */
    protected $router;
    protected $references = [
        1 => 'oxygen',
        2 => 'pH',
        3 => 'pCO2'
    ];
    protected $redirect_route = 'references';
    protected $requestStack;
    protected $session;

    public function __construct(EntityManager $entityManager, Router $router, RequestStack $requestStack, Session $session)
    {
        $this->em = $entityManager;
        $this->router = $router;
        $this->requestStack = $requestStack;
        $this->session = $session;
    }

    public function onKernelController()
    {
        $em = $this->em;
        $savedReferences = $em->getRepository('AdminBundle:ParamReference')->findAll();
        $references = $this->references;

        if (count($savedReferences) <= 0){
            $this->redirect();
        }

        for ($i =0; $i<count($savedReferences); $i++){
            if ($savedReferences[$i] !== $references[$i]) {
                $this->redirect();
            }
        }
    }

    public function redirect()
    {
        $request = $this->requestStack->getCurrentRequest();
        $route = $request->get('_route');
        $this->session->getFlashBag()->add('warning', 'You need to setup the references for the parameters before starting the work');
        if ($route != 'references'){
            $url = $this->router->generate('references');
            $redirect = new RedirectResponse($url);
            $redirect->send();
        }
    }
}

Вот services.yml

build.references:
    class: AdminBundle\EventListener\BuildReferencesEventListener
    arguments: ['@doctrine.orm.entity_manager', '@router', '@request_stack', '@session']
    tags:
        - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

В Symfony 3.4 и выше автоматическое подключение включено по умолчанию, поэтому вам просто нужно добавить аргумент с подсказкой типа в метод конструктора службы и личное свойство, чтобы присвоить значение аргумента.

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

class BuildReferencesEventListener
{
    private $em;

    public __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    public function onKernelController(FilterControllerEvent $event)
    {
        $em = this->em;
        // [...]
    }

}



Если вам нужно объявите аргументы явно, вы можете сделать это в конфигурации вашего сервиса:

# config/services.yaml
services:
    # ... same code as before

    # explicitly configure the service
    AdminBundle\EventListener\BuildReferencesEventListener:
        arguments:
            $em: '@doctrine.orm.entity_manager_interface'

Это может быть полезно для передачи параметров, которые контейнер службы не знает.

Чтобы узнать больше о сервисном контейнере, https://symfony.com/doc/3.4/service_container.html#injecting-services-config-into-a-service.

0 голосов
/ 29 апреля 2018

Добавление аргумента в раздел службы списка событий service.yml

Your.service:
    Class: AdminBundle\EventListener\BuildReferencesEventListener
    arguments: ['@doctrine.orm.entity_manager']
    tags:
        - { name: kernel.event_listener, event: kernel.controller }

И добавьте этот __cunstruct код в свой список:

namespace AdminBundle\EventListener;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Doctrine\ORM\EntityManager;

class BuildReferencesEventListener
{

    protected $em;

    function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    public function onKernelController(FilterControllerEvent $event)
    {
        //TO DO call doctrine
        // $em = Enity Manager...
        // $em->getRepository...
        // I hope its clear enough what im trying to do
    }
...