Bonjour liberatio
Je suis dans la meme situation que toi. As-tu finalement trouvé une reponse ?
Bonjour,
Voila je rencontre un petit problème avec mon code, J'ai suivis tuto de jeffcoding sur youtube, mais je suis sur symfony 3.4 et une erreur est levée pour /pro/register alors que /register fonctionne parfaitement.
Ce que je fais
Ce que je veux
Mon but est simplement que sur les 2 formulaires, les infos communes s'affichent, et les infos propre à chaque condition, à savoir user particulier, et user professionnel.
Ce que j'obtiens
Voici l'erreur:
Expected argument of type "string", "AppBundle\Form\ProRegistrationType" given
En cherchant l'erreur viens de la ligne : $form = $formFactory->create(new ParentRegistrationType($this->container->getParameter('fos_user.model.user.class')));
du contrôleur qui n'est plus actualité dans symfony 3.
Je ne parviens pas à y remedier.... Si quelq'un a une idée, je suis preneur.......
Merci d'avance à vous tous ;)
Personne ne peux m'aider? .....
11 réponses
Hello!
La réponse ici : https://api.symfony.com/3.3/Symfony/Component/Form/FormFactory.html
La méthode create de ton form factory ne demande pas un objet, mais un string...
Essaye de remplacer :
par
Ca donne quoi?...
Petite remarque, ton listener ne devrait pas se trouver dans ton controller, mais dans un listener (class propre), voire dans ton Form...
Les controllers ne devraient pas contenir de logique métier (https://symfony.com/doc/current/best_practices/controllers.html)
Merci Digivia. J'avais essayé $form = $formFactory->create('UsersBundle\Form\ProRegistrationType', $user); , mais symfony me renvoi cela :
Warning: Missing argument 1 for FOS\UserBundle\Form\Type\RegistrationFormType::__construct(), called in C:\wamp64\www\site\vendor\symfony\symfony\src\Symfony\Component\Form\FormRegistry.php on line 92 and defined
Je ne suis pas sûr de ce que doit contenir $user (mon formulaire devrait pouvoir en créer un nouveau)
Merci pour le conseil sur les listeners, je vais changer cela egalement.
sylvigouroux, tu devrais aller jeter un oeil à la doc : https://symfony.com/doc/master/bundles/FOSUserBundle/overriding_forms.html
Ca parait répondre à ton besoin, non?
En fait, j'avais bien lu la doc, mais ils expliquent simplement comment surcharger un form pour tous les formulaires d’enregistrement FOSUser.
Mon besoin est different. je voudrais créer deux types de Form : un pour les utilisateurs ROLE_USER, et un autre pour les ROLE_PRO, avec un filtrage des entités a renseigner pour le role_user et une inscription utilisant une vue spécifique en role_pro. Autrement dit, je cherche à créer des utilisateurs avec des attributs différents et pouvant s'inscrire sur des pages différentes… bref, je voudrais surcharger le contrôleur lui-même.
Mais visiblement, ça n’est pas vraiment prévu par FOSUser… ou il faudrait bidouiller (ce qui est bien au-dessus de mon niveau).
Du coup, je me suis contenté de faire un form à la main en méthode GET… faute de mieux.
Merci beaucoup pour ton aide.
Tu peux bien surcharger le controller de fos_user : https://symfony.com/doc/current/bundles/FOSUserBundle/overriding_controllers.html
Par contre, dans le code de @liberatio, je ne comprends pas bien la définition des 2 formulaires? Pourquoi le Pro n'a-t-il pas pour parent le form fos comme l'autre :
Et pourquoi la définition du service est différente? Quel est le but?
Merci pour la doc sur la surcharge ! Je n'avais pas configuré le bundle comme indiqué dans le lien. Ca marche, c'est top.
Je voulais surcharger surtout pour attribuer un role particulier aux utilisateurs courants. Je ne suis donc pas allé plus loin (un form dans la vue me suffit pour l'instant). Mais l'idée de @liberatio serait, si j'ai bien compris, d'avoir deux formulaires differents : un user et un pro. Certains champs seraient affichés pour les pro seulement et les formulaires se lanceraient par deux url differentes : app_dev.php/register et app_dev.php/pro/register
Cf. https://www.youtube.com/watch?v=Y797Rr5ypQk
Bon, j'ai beau débuter sur symfony, ca ne me semble un peu tiré par les cheveux tout de même. Quel est l'interet de surcharger TOUS les élements de FOSuser : le form, les entités et le controleur d'enregistrement ? Surtout que l'on s'en sort très bien avec un formulaire fait a la mano dans la vue... non ?
Sylvigouroux,
C'est le principe de base de Symfony, et c'est pour cela que c'est génial, tu peux tout surcharger!
C'est suivant tes besoins, dans certains cas, il peut être utile de surcharger pas mal de choses.
Après sur un bundle tiers comme fos user, si tu commences à avoir besoin de tout surcharger, tu repars from scratch et tu dev à partir de la brique sécu (très bien pensée) de Symfony. Fos user est très bien si ton besoin est standard, j'entends par là proche de la philsophie de ce bundle. Rien n'est imposé par Symfony (surtout pas des bundles tiers!), et c'est tout l'intérêt de ce framework.
Ce qu'il amène de plus important, ce sont les bonnes pratiques et une manières moderne de développer (interfaces, modularité, etc.). Regarde du côté de la V4 de Symfony, c'est exactement ça! Use what you need....
Merci pour les explications sur la philosophie Symfony. C'est assez important quand l’on débute pour cerner les bonnes pratiques. Bien compris. Sinon, il faudrait que je passe à la 4 en effet... mais j'ai quelques (c’est un euphémisme) dépréciations à régler auparavant.
Tu peux passer par la 3.3 puis 3.4 pour résoudre tes dépréciations.
Pour la V4, regarde quand même le temps à passer, si ton app est bien avancée, ça vaut peut-être le coup de rester en 3.4 (qui est LTS, donc support 3 ans)... Pour un nouveau projet ça vaut le coup, pour de l'existant, il faut mesurer, pas forcément rentable (changements de directories, namespaces, ect.)... Sauf si tu as un manque de perfs (les benchmark de la V4 sont hallucinants).
PS : tu as tout compris, l'utilisation des bonnes pratiques est l'élément le plus important :)
Salut je sais que le sujet est vieux mais je rencontre la meme difficulté ... @sylvigouroux peux tu m'expliquer comment tu as résolu le problème après avoir suivi le meme tuto sur youtube? J'espere que vous me repondrez...Merci d'avance