Проверка базы данных внутри ядра - PullRequest
0 голосов
/ 12 мая 2018

Во-первых, я хочу извиниться за неясное название, но я не мог придумать лучшего способа выразить его, чтобы отразить реальную проблему, и если вы можете помочь мне с лучшим после того, как вы прочитаете реальную проблему, я бы оценил его.

У меня есть проект, в котором мои клиенты могут запросить демонстрацию моего приложения (представьте, что это SaaS), и поэтому сценарий создает новый экземпляр этого приложения, прежде чем клиент попробует приложение и сделает все, что ему захочется.он должен сделать короткую настройку (установить язык, регион, часовой пояс и т. д.), после чего данные будут сохранены в базе данных, и он сможет сделать свое дело.Но при каждом доступе к приложению сценарий должен проверять, завершена ли установка в этом экземпляре (в этом случае клиент перенаправляется на домашнюю страницу) или нет (клиент перенаправляется на установку).И вот здесь возникает проблема: я хочу выполнить эту проверку только в одном месте и использовать все маршруты, к которым пользователь может получить доступ, в противном случае мне придется делать это способом Symfony, а это означает, что нужно автоматически подключать пользовательский сервис и использовать метод.этой службы на каждом контроллере, который у меня есть, что занимает много времени ...

Я думаю, что лучшее место для этой проверки - класс ядра, но я не могу понять, как использовать EntityManager там, чтобы я могсоздать собственный запрос ...

Есть идеи?Есть ли лучший способ сделать это? (Пожалуйста, дайте мне знать, как и почему) Спасибо

1 Ответ

0 голосов
/ 14 мая 2018

Ответ, который вы ищете, подписчик на событие :).Вы правильно думаете: «Я хочу поместить этот код в свое ядро».Итак, когда ядро ​​обрабатывает запрос, оно отправляет «события» (то есть перехватчики), которые позволяют вам запускать код.

В вашем случае вы должны создать подписчика на событие kernel.request.Это событие отправляется по КАЖДОМУ запросу до выполнения контроллера.Здесь вы можете делать любую логику, которая вам нужна.И вы даже можете перенаправить пользователя, если хотите.Это будет выглядеть так:

public function onKernelRequest(GetResponseEvent $event)
{
    $isSetup = false; // replace with your real logic

    if (!$isSetup) {
        // By setting the response, the controller will never be called
        $event->setResponse(new RedirectResponse(
            // this assume you've injected the router
            // is redirects to some "finish_setup" route
            $this->router->generate('finish_setup');
        ));
    }
}

Вы даже можете загрузить класс подписчика событий в Symfony 4, если у вас установлен MakerBundle, запустив:

php bin/console make:subscriber

Cheers!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...