Как назначить роли при успешной регистрации?

Я использую fos user bundle и pugx multi user bundle. Я прочитал всю документацию и я новичок в Symfony. В многопользовательском пакете pugx есть образец по каждому пункту, кроме одного: успешная регистрация.

  • Образцы переопределяющих контроллеров для генерации форм => ok
  • Образцы переопределяющих шаблонов для генерации форм => ok
  • Образцы переопределения успешной регистрации образца => ничего.

Вот мой код:

class RegistrationController extends BaseController
{
    public function registerAction(Request $request)
    {   
        $response = parent::registerAction($request);
        return $response;
    }   

    public function registerTeacherAction()
    {   
        return $this->container
            ->get('pugx_multi_user.registration_manager')
            ->register('MyBundle\Entity\PersonTeacher');
    }   

    public function registerStudentAction()
    {   
        return $this->container
            ->get('pugx_multi_user.registration_manager')
            ->register('MyBundle\Entity\PersonStudent');
    }   
}

Проблема с ->get('pugx_multi_user.registration_manager') который возвращает менеджера. В справке по перегруженным контроллерам пользователя fos они получают либо form или form.handler, У меня трудные времена, чтобы связать их с менеджером pugx_multi_user.

Какой код я должен вставить в registerTeacherAction() установить роли для учителя, и в registerStudentAction() установить роли для студента при успешной регистрации?

1 ответ

Решение

Решение 1 (Слушатель Доктрины / Подписчик)


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

Слушатель

namespace Acme\YourBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Acme\YourBundle\Entity\Student;

class RoleListener
{
    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        // check for students, teachers, whatever ...
        if ($entity instanceof Student) {
            $entity->addRole('ROLE_WHATEVER');
            // or
            $entity->addGroup('students');
            // ...
        }

       // ... 
    }
}

Конфигурация сервиса

# app/config/config.yml or load inside a bundle extension
services:
    your.role_listener:
        class: Acme\YourBundle\EventListener\RoleListener
        tags:
            - { name: doctrine.event_listener, event: prePersist }

Решение 2 (Обратные вызовы Doctrine LifeCycle):


Используя обратные вызовы жизненного цикла, вы можете интегрировать ролевые / групповые операции непосредственно в вашу сущность.

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 */
class Student
{
    /**
     * @ORM\PrePersist
     */
    public function setCreatedAtValue()
    {
        $this->addRole('ROLE_WHATEVER');
        $this->addGroup('students');
    }

Решение 3 (Диспетчер событий):


Зарегистрируйте прослушиватель / подписчик на событие "fos_user.registration.success".

Как создать прослушиватель событий / компонент Event Dispatcher.

Другие вопросы по тегам