Как назначить роли при успешной регистрации?
Я использую 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.