Проблема здесь в том, что Symfony пытается преобразовать значение типа выбора в массив для пользовательских ролей, поскольку значение выбора представляет собой строку 'Utilisateur' => "ROLE_USER"
.
Единственное решение состоит в том, чтобы не определять специфицированный c объект для формы и после применения значений к пользовательскому объекту.
- Сначала создайте тип пользователя, когда форма будет иметь вид:
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// The builder doesn't change
$builder
->add('email')
->add('prenom')
->add('nom')
->add('password', PasswordType::Class)
->add('confirm_password', PasswordType::Class)
->add('roles', ChoiceType::class, [
'choices' => [
'Utilisateur' => 'ROLE_USER',
'Validateur' => 'ROLE_VALIDATEUR',
'Administrateur' => 'ROLE_ADMIN'
]
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([]);
}
}
После этого создайте свой контроллер и создайте форму:
class UserController extends AbstractController
{
public function index(Request $request, EntityManagerInterface $manager)
{
// Create the form
$form = $this->createForm(UserType::class);
// Render the Twig file and pass the form as a view
return $this->render('user/index.html.twig', ['form' => $form->createView()]);
}
}
Затем вам нужно обработать форму и присвоить все свойства вашей сущности следующим образом:
public function index(Request $request, EntityManagerInterface $manager)
{
$form = $this->createForm(UserType::class);
// Processing the form from the request
$form->handleRequest($request);
// Check if form is submitted
if($form->isSubmitted()) {
// Fetch data from the form
$data = $form->getData();
// Create user from data
$user = (new User)
->setEmail($data['email'])
->setPrenom($data['prenom'])
->setNom($data['nom'])
->setPassword($data['password'])
->setConfirmPassword($data['confirm_password'])
// Here, we convert the string to an array
->setRoles([$data['roles']]);
// Add the user to the database
$manager->persist($user);
$manager->flush();
}
return $this->render('user/index.html.twig', ['form' => $form->createView()]);
}
Есть еще одна проблема с кодом выше: нарушения не запускаются, и возникает ошибка при возникновении конфликтов между двумя объектами (во время
$manager->flush()
). Следующий код является исправлением (мы можем использовать
валидатор , чтобы проверить, является ли сущность действительной):
// Request validator as injection dependency
public function index(Request $request, EntityManagerInterface $manager, ValidatorInterface $validator)
{
$form = $this->createForm(UserType::class);
// Set default values for validation variables
$violations = null;
$conflict = false;
$form->handleRequest($request);
if($form->isSubmitted()) {
$data = $form->getData();
$user = (new User)
->setEmail($data['email'])
->setPrenom($data['prenom'])
->setNom($data['nom'])
->setPassword($data['password'])
->setConfirmPassword($data['confirm_password'])
// Here, we convert the string to an array
->setRoles([$data['roles']]);
// Get violations from the user entity with the 'validate' function
$violations = $validator->validate($user);
// Check if there are no violations. If it is, the user is valid
if($violations->count() === 0) {
$manager->persist($user);
// Catch a unique constraint violation exception during flushing
try {
$manager->flush();
} catch(UniqueConstraintViolationException $e) {
$conflict = true;
}
}
}
return $this->render('user/index.html.twig', [
'form' => $form->createView(),
// Pass violations and conflict
'violations' => $violations,
'conflict' => $conflict
]);
}
Я надеюсь, что помогу вам!
Если вы хотите создать поле, в котором мы можем выбрать несколько ролей, эта ссылка может помочь вам (веб-сайт на французском языке).