Symfoyn 3.4: FOS User Bundle: контроллер переопределения - PullRequest
0 голосов
/ 30 апреля 2018

Я работаю с Symfoyn 3.4 lts и попытался переопределить действие FOS User Bundle loginAction.

PS: с Symfony 3.4 наследование комплекта устарело, поэтому для переопределения действия просто создайте действие с тем же маршрутом.

Итак, сначала я создал пакет, который я назвал src / MyVendor / MyVendorFOSUserBundle

во-вторых, я скопировал SecurityController.php из vendor / в свой пакет Controller / и я поставил Route Decorator над loginAction, но у меня возникает проблема при отправке формы входа => Недопустимый токен CSRF: по отладке я считаю, что $ tokenManager не вводится в контроллер, поэтому он принимает нулевое значение: В этом коде я только что добавил декоратор @Route и расширяет BaseController до скопированного Contoller.

#src/MyVendor/MyVendorFOSUserBundle/Controller/SecurityController.php:

    class SecurityController extends BaseController
    {
    private $tokenManager;

    public function __construct(CsrfTokenManagerInterface $tokenManager = null)
    {
        $this->tokenManager = $tokenManager;
    }
     /**
      * @param Request $request
      * @return Response
      * @Route("/login")
      */
    public function loginAction(Request $request)
    { ... }

Итак, чтобы попытаться исправить эту проблему, я попытался добавить имя атрибута в @Route Decorator и сохранил то же имя маршрута, что и в FOS User Bundle, но в этом случае исполняемый пакет Controller of FOS User и мой новый контроллер был проигнорирован (я проверяю это, помещая die ('test') в конструктор контроллера)

Вопрос Как решить, как правильно переопределить это действие?

Ответы [ 2 ]

0 голосов
/ 01 августа 2018

У меня была такая же проблема, я загрузил маршруты по отдельности и указал действие входа в систему на моем контроллере cutom, который расширяет FOSUsercontroller с помощью некоторой пользовательской логики.

fos_user_security_login:
   path: /login
   methods: [GET, POST]
   defaults: { _controller: 'YourUserBundle\Controller\SecurityController:loginAction' }

fos_user_security_check:
   path: /login_check
   methods: [POST]
   defaults: { _controller: fos_user.security.controller:checkAction }

fos_user_security_logout:
   path: /logout
   methods: [GET, POST]
   defaults: { _controller: fos_user.security.controller:logoutAction }

Затем я зарегистрировал контроллер как сервер, чтобы решить проблему с отсутствующим токеном

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

Правильный способ переопределения контроллера FOSUserBundle следующий:

1) Создайте свой дочерний пакет и установите для него родительский FOSUserBundle (я полагаю, вы не сделали этого правильно)

<?php
// src/My/UserBundle/MyUserBundle.php

namespace My\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class MyUserBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

2) Теперь вам нужно создать класс контроллера с тем же именем и в том же месте, что и контроллер, который вы хотите переопределить.

Не забудьте, в вашем случае вам нужно использовать SecurityController в качестве BaseController!

<?php

namespace My\UserBundle\Controller;

use FOS\UserBundle\Controller\SecurityController as BaseController;
use Symfony\Component\HttpFoundation\Request;

class SecurityController extends BaseController
{
    public function loginAction(Request $request)
    {
        return parent::loginAction($request); // TODO: Change the autogenerated stub

    }
}

пс. Также читая от других, было бы полезно очистить кеш. php bin / console cache: clear --env = dev

...