src/Form/UserType.php line 56
<?phpnamespace App\Form;use App\Entity\User;use Symfony\Component\Form\FormError;use Symfony\Component\Form\FormEvent;use Symfony\Component\Form\FormEvents;use Symfony\Component\Form\AbstractType;use Vich\UploaderBundle\Form\Type\VichFileType;use Symfony\Component\Form\FormBuilderInterface;use Symfony\Component\Validator\Constraints\File;use Symfony\Component\Validator\Constraints\Email;use Symfony\Component\Validator\Constraints\Regex;use Symfony\Component\Validator\Constraints\NotBlank;use Symfony\Component\OptionsResolver\OptionsResolver;use Symfony\Component\Validator\Constraints as Assert;use Symfony\Component\Form\Extension\Core\Type\TelType;use Symfony\Component\Form\Extension\Core\Type\FileType;use Symfony\Component\Form\Extension\Core\Type\TextType;use Symfony\Component\Form\Extension\Core\Type\EmailType;use Symfony\Component\Form\Extension\Core\Type\ChoiceType;use Symfony\Component\Form\Extension\Core\Type\PasswordType;use Symfony\Component\Form\Extension\Core\Type\TextareaType;use Symfony\Component\EventDispatcher\EventSubscriberInterface;class UserFormSubscriber implements EventSubscriberInterface{public static function getSubscribedEvents(){return [FormEvents::SUBMIT => 'onSubmit',];}public function onSubmit(FormEvent $event){$data = $event->getData();$form = $event->getForm();$user = $form->getData();$password = $form->get('password')->getData();$passwordConfirmed = $form->get('password_confirmed')->getData();if ($password && $password === $passwordConfirmed) {$user->setPassword($password);} else {$form->get('password')->addError(new FormError('Les mots de passe ne correspondent pas'));}$event->setData($data);}}class UserType extends AbstractType{public function buildForm(FormBuilderInterface $builder, array $options): void{$builder->add('email', EmailType::class, ['attr' => ['placeholder' => "exemple@domaine.com",'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'],'label' => 'Adresse email*','label_attr' => ['class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'],'error_bubbling' => false,'constraints' => [new Email(['mode' => 'strict']),new NotBlank(['message' => 'L\'adresse email est obligatoire']),]])->add('roles', ChoiceType::class, ["choices" => ["ADMIN" => "ROLE_ADMIN","COMMERCE" => "ROLE_COMMERCE","USER" => "ROLE_USER"],'multiple' => true,'expanded' => true,'attr' => ['hidden' => true],'data' => ['ROLE_COMMERCE']])->add('password', PasswordType::class, ["attr" => ["placeholder" => "votre mot de passe",'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'],'label' => 'Mot de passe*','label_attr' => ['class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'],"mapped" => false,'constraints' => [new NotBlank(),new Regex("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/","Le mot de passe doit contenir au minimum 8 caractères, une majuscule, un chiffre et un caractère spécial"),]])->add('password_confirmed', PasswordType::class, ["attr" => ["placeholder" => "veuillez confirmer le mot de passe",'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'],'label' => 'Confirmez le mot de passe*','label_attr' => ['class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'],"mapped" => false,'constraints' => [new NotBlank(),new Regex("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/","Le mot de passe doit contenir au minimum 8 caractères, une majuscule, un chiffre et un caractère spécial"),]])->add('firstName', TextType::class, ['attr' => ['placeholder' => "votre prénom",'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'],'label' => 'Prénom*','label_attr' => ['class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'],'constraints' => [new NotBlank(['message' => 'Le prénom est obligatoire'])]])->add('lastName', TextType::class, ['attr' => ['placeholder' => "votre nom",'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'],'label' => 'Nom*','label_attr' => ['class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'],'constraints' => [new NotBlank(['message' => 'Le nom est obligatoire'])]])->add('picture', VichFileType::class, ['attr' => ['class' => 'hidden'],'label' => 'Photo de profil','label_attr' => ['class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'],'mapped' => false,'required' => false,'constraints' => [new Assert\Image(['maxSize' => '5M','mimeTypes' => ['image/jpeg','image/png','image/webp',],'mimeTypesMessage' => 'Veuillez uploader une image valide (jpeg, png ou webp)',])]])->add('phoneNumber', TelType::class, ['attr' => ['placeholder' => "06 00 00 00 00",'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'],'label' => 'Numéro de téléphone*','label_attr' => ['class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'],'constraints' => [new Assert\Regex(['pattern' => '/^\+?\d{1,3}[- ]?\d{2,4}[- ]?\d{2,4}[- ]?\d{2,4}$/','message' => 'Le numéro de téléphone n\'est pas valide.']),new NotBlank(['message' => 'Le numéro de téléphone est obligatoire']),]])->add('about', TextareaType::class, ['attr' => ['placeholder' => "parlez-nous de vous...",'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'],'label' => 'Présentation','label_attr' => ['class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'],'required' => false]);// Ajouter l'abonnement à l'événement FormEvents::SUBMIT$builder->addEventSubscriber(new UserFormSubscriber());}public function configureOptions(OptionsResolver $resolver): void{$resolver->setDefaults(['data_class' => User::class,]);}}