Как автоматически запустить сервис?

Добрый день.

При входе на сайт, или при переходе на другую страницу, требуется автоматически выполнять какие-то действия. Например у меня сейчас имеется класс rc/Service/MenuPuller вида:
class MenuPuller extends AbstractController
{
    const TOP_MENU = 1;
    const DOWN_MENU = 2;
    const DOWN_SIDEBAR_MENU = 3;
...
 public function getMenu( $category )
{
...

В метод класса getMenu возвращает массив ссылок из которых и строится нужное меню. Использую так:
...
use App\Service\MenuPuller;

class DefaultController extends AbstractController
{
    /**
     * @Route("/", name="app_homepage")
     */
    public function index( MenuPuller $menuPuller  )
    {
  	return $this->render('default/index.html.twig', [
            'main_nav' => $menuPuller->getTopMenu(),
            'footer_nav' => $menuPuller->getDownMenu(),
            'footer_sidebar_nav' => $menuPuller->getDownSidebarMenu(),
            'post' => $_GET
        ]);
    }
}


Есть еще класс Autologin оформленный как сервис для автоматической авторизации:
...
class Autologin extends AbstractController
{

    public static function autologin( String $email, Request $request, AbstractController $ac )
    {
        $dispatcher = new EventDispatcher();
        $user = $ac->getDoctrine()->getManager()->getRepository("App\Entity\User")->findOneBy(['email' => $email ]);
        $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
        $ac->get('security.token_storage')->setToken($token);
        $ac->get('session')->set('_security_main', serialize($token));
        $event = new InteractiveLoginEvent($request, $token);
        $dispatcher->dispatch($event);
    }
}
...
// Где-то в коде вызывается так:
// вместо "user2@mail.ru" будет глобальная переменная, здесь просто для примера.

public function dashboardAction()
    {
        Autologin::autologin( "user2@mail.ru", $request, $this );
...
 public function indexAction(Request $request)
    {
        Autologin::autologin( "user2@mail.ru", $request, $this );
...


Т.е. проверку нужно проводить в нескольких местах, так как неизвестно, с на какую именно страницу пользователь зайдет.

Если страниц немного, то, IMHO, такой подход имеет право на существование, но страниц будет много, помимо этих сервисов будет ещё х.з. сколько подобных и использование последовательности подобных вызовов в каждом контроллере , которому нужны эти данные, начинает напоминать "костыли". Подскажите "правильные" подходы: использование событий, наследование классов каких-то системных сервисов, ну, или как-то ещё. Т.е. в идеале контроллер ( страницы, например ) должен иметь нужные ему данные, либо обратившись к какому-то одному ресурсу. Надеюсь понятно объяснил. Заранее благодарен.
  • Вопрос задан
  • 65 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы