Salut à tous !

J'ai un souci lorque j'enregistre un nouvel utilisateur (User).

Je m'explique, j'ai une entité User, celui-ci à plusieurs propriétés dont ses langues parlées ( ex : anglais, allemand, italien, etc).
j'ai une entité Language à un id et code (code de la langue, ex = EN pour anglais)
j'ai une entité UserLanguage , une classe d'association pour faire la relation entre User et Language avec un attribut $level

Les langues de l'utilisateur et leur niveau (de 0 à 3 pour native, débutant, bon, expert) peuvent se décomposer comme ça =>

1) Langue native ( exemple FR) (niveau max par défaut = 0)
2) EN avec un niveau à (bon = 2 par exemple)
3)Eo avec niveau à (débutant = 1 )
4) etc..

A l'inscription, l'utilisateur doit seulement enregistrer sa langue native (maternelle) avec un menu déroulant (hydrater via intl de symfony)

Le problème est quand mon registerType (formulaire d'inscription) est généré par symfony, il se base sur User, et à l'enregistrement apres submit du Form, dans mon controleur, je n'arrive pas à faire tout simplement que la langue soit enregistrer dans la classe Language et lié à l'User...

J'ai plusieurs type d'erreur au fur et à mesure de tout mes essais...

Voici le code de tout ça ........
USER

<?php
/**
 * @Class User
 */
namespace App\Entity;

use App\Entity\Language;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="user")
 * @UniqueEntity(fields="username")
 */
class User implements UserInterface, \Serializable
{
    /**
    * @var integer $id
    *
    * @ORM\Column(name="id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

    /**
     * username is email for login/register
     * 
     * @ORM\Column(type="string", length=255, unique=true)
     * @Assert\Email
     * @var $username
     */
    private $username;

    /**
     * @ORM\Column(name="password", type="string", length=255)
     * @var $password
     */
    private $password;

    /**
     * @ORM\Column(name="nickname", type="string", length=255)
     * @Assert\Length(min=3)
     * @var $nickname
     */
    private $nickname;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\UserLanguage", mappedBy="user")
     * 
     */
    private $language;

//.............//

/**
     * @method array __construct
     */
    public function __construct()
    {
        $this->isActive = true;
        $this->roles = array("ROLE_USER");   
        $this->interest = new ArrayCollection();  
        $this->language = new ArrayCollection();  
    }

    public function addLanguage(Language $language)
    {
        $this->language[] = $language;
        // On lie l'user à la language
        $language->setUser($this);
        return $this;
    }

    public function removeLanguage(Language $language)
    {
        $this->language->removeElement($language);
        // Et si notre relation était facultative (nullable=true, ce qui n'est pas notre cas ici attention) :        
        // $languages->setUser(null);
    }

    //.......................//// 

    /**
     * Get the value of languages
     */ 
    public function getLanguage()
    {
        return $this->language;
    }

    /**
     * Set the value of languages
     *
     * @return  self
     */ 
    public function setLanguage($language)
    {
        $this->language[] = $language;

        return $this;
    }

LANGUAGE

<?php
namespace App\Entity;

use App\Entity\User;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Table(name="language")
 * @ORM\Entity(repositoryClass="App\Repository\LanguageRepository")
 */
class Language {

    /**
    * @var integer $id
    *
    * @ORM\Column(name="id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

    /**
     * @ORM\Column(name="code", type="string", length=10)
     */
    private $code;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\UserLanguage", inversedBy="language")
     * 
     */
    private $user;

    /**
     * Get the value of id
     */ 
    public function getId()
    {
        return $this->id;
    }

    /**
     * Get the value of code
     */ 
    public function getCode()
    {
        return $this->code;
    }

    /**
     * Set the value of code
     *
     * @return  self
     */ 
    public function setCode($code)
    {
        $this->code = $code;

        return $this;
    }

    /**
     * Get the value of user
     */ 
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Set the value of user
     *
     * @return  self
     */ 
    public function setUser($user)
    {
        $this->user = $user;

        return $this;
    }
}

USERLANGUAGE

<?php
namespace App\Entity;

use App\Entity\User;
use App\Entity\Language;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="user_language")
 * @ORM\Entity(repositoryClass="App\Repository\UserLanguageRepository")
 */
class UserLanguage
{

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="App\Entity\User")
     */
    protected $user;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="App\Entity\Language")
     */
    protected $language;

    /**
     * @var int
     * @ORM\Column(name="level",type="integer")
     */
    private $level;

    /**
     * Get the value of level
     */ 
    public function getLevel()
    {
        return $this->level;
    }

    /**
     * Set the value of level
     *
     * @return  self
     */ 
    public function setLevel(int $level)
    {
        $this->level = $level;

        return $this;
    }

    /**
     * Get the value of user
     */ 
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Set the value of user
     *
     * @return  self
     */ 
    public function setUser(User $user)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get the value of language
     */ 
    public function getLanguage()
    {
        return $this->language;
    }

    /**
     * Set the value of language
     *
     * @return  self
     */ 
    public function setLanguage(Language $language)
    {
        $this->language = $language;

        return $this;
    }
}

registerType

<?php

namespace App\Form;

use App\Entity\User;
use App\Entity\Language;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\RadioType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\LanguageType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CountryType;

class RegistrationType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', EmailType::class, array(
                'label' => 'register.label.email', 'required'=> true
                ))
            ->add('password', PasswordType::class, array(

                'label' => 'register.label.password', 'required'=> true
                ))
            ->add('nickname', TextType::class, array(
                'label' => 'register.label.nickname', 'required'=> true
                ))

            ->add('language', LanguageType::class, array(
                'label' => 'register.label.language', 'required'=> true
                ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => User::class,
        ));
    }
}

Et le controller RegisterController, qui pour l'instant , est un grand n'importe quoi :-D ...

<?php
namespace App\Controller;

use App\Form\RegistrationType;
use App\Entity\User;
use App\Entity\Language;
use App\Entity\UserLanguage;
use App\Service\EmailProvider;
use App\Service\LanguagesProvider;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Validator\Constraints\DateTime;
use Symfony\Component\Intl\Intl;

class RegistrationController extends Controller
{

    public function register(Request $request, UserPasswordEncoderInterface $passwordEncoder, EmailProvider $emailProvider, LanguagesProvider $languagesProvider)
    {
        // Entities User
        $user = new User();

        // build the form
        $form = $this->createForm(RegistrationType::class, $user);
        // handle the submit (will only happen on POST)
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            $entityManager = $this->getDoctrine()->getManager();

            // Encode the password (you could also do this via Doctrine listener)
            $password = $passwordEncoder->encodePassword($user, $user->getPassword());
            // Save _locale of user
            $locale = $request->getLocale();
            // Create tokenRegister
            $tokenRegister = base64_encode(random_bytes(64));

            // Language
            $codeLanguage = $form->get('language')->getData();
            $language = $this->getDoctrine()->getRepository(Language::class)->findByCode($codeLanguage);

            // Inject parameters for user
            $user->setTokenRegister($tokenRegister);
            $user->setLocale($locale);
            $user->setPassword($password);
            $user->setFirstConnection(new \DateTime('NOW'));
            $user->setLastConnection(new \DateTime('NOW'));
            $user->setLanguage($language);

            $entityManager->persist($user);
            //$entityManager->flush();

            // Create new relation user language
            $userLanguage = new UserLanguage();
            // linking language
            $userLanguage->setLanguage($language); 
            // linking user
            $userLanguage->setUser($user);
            // Setting level, for native language, this is 0 (else 1=beginner, 2=good, 3=expert)
            $userLanguage->setLevel(0);
            // Persist
            $entityManager->persist($userLanguage);

            // Save
            $entityManager->flush();

            // Send confirmation mail with EmailProvider
            $emailRegister = $emailProvider->emailRegister($user);

            $this->addFlash('success',$this->get('translator')->trans('register.message.success'));

            //return $this->redirectToRoute('index');
        }

        // Render all languages
        $langs = $languagesProvider->getAllLanguages($request);

        // Render twig
        return $this->render(
            'registration/register.html.twig',
            array('form' => $form->createView(), 'languages' => $langs)
        );

    }
}

Voilà si des courageux sont arrivés jusque là, c'est cool, merci pour votre aide !

18 réponses


Valdior
Réponse acceptée
'choice_label' => 'code',

Salut,

Je pense que c'est une relation ManyToMany avec extra field que tu as. Je ne me suis pas encore lancer dedans mais je sais que dans les prochaines semaine je vais devoir y travailler, j'ai donc commencer mes recherches et je suis tomber sur un exemple qui montre exactement ce que tu cherche et moi aussi mais je n'est pas eu le temps de le mettre en pratique.

Voici le lien de l'exemple ManyToMany extra field example

Regarde dans cette exemple la class "StudentSubjectController::createProcessAction()" et adapte le avec tes classes.

A première vue cela devrais ressembler à ceci :

            $data = $form->getData();

            $userLangue = new UserLanguage();
            $userLangue->setUser($data->getUser());
            $userLangue->setLanguage($data->getLangue());
            $userLangue->setLevel(0);

            $em = $this->getDoctrine()->getManager();
            $em->persist($userLangue);
            $em->flush();

Il faudrait que tu indique les différentes erreurs que tu à eu avec tes test car c'est difficile de savoir se qui va pas.

En tous cas j'espère que sa t'aidera.

Salut ksta, je te remercie pour ton coup de main, de plus si tu vas avoir la même chose à faire ça tombe bien pour nous deux :-).
Je vais regarder ça dans le we, plutot lundi, je te fais mes retours juste après. Merci , à bientôt pour la suite.

Edit :
Je jeter un oeil tout de même sur le lien, je vois qu'il fait un controlleur par entité, mais dans mon cas, j'ai besoin d'un controller registerController qui gere affiche un seul form (registerType)...

Bonjour laplumaencre,

Il y a des erreurs d'annotations dans tes entitées.

Dans la class Language, c'est une relation OneToMany qu'il te faut. Donc c'est une mappage sur l'entité également

class Language {
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\UserLanguage", mappedBy="language")
     */
    private $user;

Pour la class UserLanguage, j'ai juste ajouté une contrainte supplémentaire, toujours bon à prendre ;)

class UserLanguage
{

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="language")
     * @ORM\JoinColumn(nullable=false)
     */
    protected $user;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="App\Entity\Language", inversedBy="user")
     * @ORM\JoinColumn(nullable=false)
     */
    protected $language;

    /**
     * @var int
     * @ORM\Column(name="level",type="integer")
     */
    private $level;

Pour la class User, juste penser à changer l'utilisation de la class. En effet, tu cherches un lien vers UserLanguage et non pas Language directement.

/**
 * @Class User
 */
namespace App\Entity;

use App\Entity\UserLanguage;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="user")
 * @UniqueEntity(fields="username")
 */
class User implements UserInterface, \Serializable
{

j'espère que sa t'aidera.

Salut Valdior, merci pour ta réponse. J'ai en effet fait les modif que tu me propose, mais j'ai toujours un problème au moment d'inscrire un user.
Dernier message en date de symfony =>
Could not determine access type for property "language" in class "App\Entity\User".

Voici mon code çà jour, en plus des class User, Language et UserLanguage=>
RegisterController =>

<?php
namespace App\Controller;

use App\Form\RegistrationType;
use App\Entity\User;
use App\Entity\Language;
use App\Entity\UserLanguage;
use App\Service\EmailProvider;
use App\Service\LanguagesProvider;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Validator\Constraints\DateTime;
use Symfony\Component\Intl\Intl;

class RegistrationController extends Controller
{

    public function register(Request $request, UserPasswordEncoderInterface $passwordEncoder, EmailProvider $emailProvider, LanguagesProvider $languagesProvider)
    {
        // New User
        $user = new User();

        // Build the form
        $form = $this->createForm(RegistrationType::class, $user);

        // handle the submit (will only happen on POST)
        $form->handleRequest($request);

        // Form Submitted
        if ($form->isSubmitted() && $form->isValid()) {

            //http://www.inanzzz.com/index.php/post/toza/many-to-many-association-example-in-symfony
            // Reste a voir pour les formType de chauqe entity et les imbriquées

            $data = $form->getData();
            $em = $this->getDoctrine()->getManager();

            //USER
            // Encode the password
            $password = $passwordEncoder->encodePassword($user, $user->getPassword());
            // Save _locale of user
            $locale = $request->getLocale();
            // Create tokenRegister
            $tokenRegister = base64_encode(random_bytes(64));
            //Inject parameters for user
            $user->setTokenRegister($tokenRegister);
            $user->setLocale($locale);
            $user->setPassword($password);
            $user->setFirstConnection(new \DateTime('NOW'));

            $codeLanguage = $form->get('language')->getData();
            $language = $em->getRepository(Language::class)->findByCode($codeLanguage);

            $em->persist($user);

            //USERLANGUAGE
            $userLanguage = new UserLanguage();
            $userLanguage->setUser($user);
            $userLanguage->setLanguage($language);
            $userLanguage->setLevel(0);

            $em->persist($userLanguage);
            $em->flush();
//-----------------

            // Voir créer event => https://blog.dev-web.io/2018/01/07/symfony-4-gestion-devenements/
            // Send confirmation mail with EmailProvider
            $emailRegister = $emailProvider->emailRegister($user);

            // Flash Message
            $this->addFlash('success',$this->get('translator')->trans('register.message.success'));

            // redirect to ...
            //return $this->redirectToRoute('index');
        }

        //VIEW
        // Render all languages with LanguagesProvider
        $langs = $languagesProvider->getAllLanguages($request);

        // Render twig
        return $this->render(
            'registration/register.html.twig',
            array('form' => $form->createView(), 'languages' => $langs)
        );

    }
    // end
}

Mon RegistrationType, c'est là que ça va plus, le champ language provient de languageType fournit par Intl de symfony, et le form se base sur les attributs de User, en fait j'ai le menu deroulant qui affiche toutes les language d'apres le json de Intl, à l'inscription je veux récuperer le code langue, et créer le lien Language par rapport à la table identique dans la DB , correspondant à la classe Language.

<?php

namespace App\Form;

use App\Entity\User;
use App\Entity\Language;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\RadioType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\LanguageType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CountryType;

class RegistrationType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', EmailType::class, array(
                'label' => 'register.label.email', 'required'=> true
                ))
            ->add('password', PasswordType::class, array(

                'label' => 'register.label.password', 'required'=> true
                ))
            ->add('nickname', TextType::class, array(
                'label' => 'register.label.nickname', 'required'=> true
                ))

            ->add('language', LanguageType::class, array(
                'label' => 'register.label.language', 'required'=> true
                ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => User::class,
        ));
    }
}

Je ne sais pas pour ton problème avec RegistrationType, car je n'ai jamais utilisé Intl de symfony. Je risquerai plus de t'induire en erreur.

Mais pour l'erreur dans le RegistrationController, c'est assez parlant.
Tu as des annotations qui sont erronées.

public function addLanguage(Language $language)
    {
        $this->language[] = $language;
        // On lie l'user à la language
        $language->setUser($this);
        return $this;
    }

    public function removeLanguage(Language $language)
    {
        $this->language->removeElement($language);
        // Et si notre relation était facultative (nullable=true, ce qui n'est pas notre cas ici attention) :        
        // $languages->setUser(null);
    }

    //.......................//// 

    /**
     * Get the value of languages
     */ 
    public function getLanguage()
    {
        return $this->language;
    }

    /**
     * Set the value of languages
     *
     * @return  self
     */ 
    public function setLanguage($language)
    {
        $this->language[] = $language;

        return $this;
    }

Je suppose qu'il y a du copier/coller dans cette partie. Je te conseil donc de les supprimer, puis de le regénérer via la console.
Tu verras la différence et comprendra mieu ton problème

J'ai modifié le code depuis regarde mon dernier post, en ezffet, il y avait une erreur à ce niveau aussi.

je vois bien ton dernier post, mais pas la class User. Or l'erreur devrait être dans cette class.
Maintenant dans ton RegistrationController , j'ai remarqué ce code :

$languageRepository = $em->getRepository(Language::class)->findByCode($codeLanguage);
$language= new Language($languageRepository);

Je ne le comprend pas, le but du Repository est de te retourné ton entité. Pourquoi faire un new Language juste après ?

$language = $em->getRepository(Language::class)->findByCode($codeLanguage);

Parcequ'en fait, quand je récupère l'entité (correspondant au à la langue que l'user a choisit dans le menu déroulant), j'ai une erreur comme quoi c'est un array, class attendu, alors que j'ai fait un dump(), c'est bien une class. Du coup je fais ça mais je suis d'accord avec toi, je comprend pas.
edit : je n'ai plus l'erreur en modifiant, par contre toujours cette erreur =>
Could not determine access type for property "language" in class "App\Entity\User".
edit: , partie du code mofidié =>


            $codeLanguage = $form->get('language')->getData();
            $language = $em->getRepository(Language::class)->findByCode($codeLanguage);
            //$language= new Language($languageRepository);

            $em->persist($user);

            //USERLANGUAGE
            $userLanguage = new UserLanguage();
            $userLanguage->setUser($user);
            $userLanguage->setLanguage($language);
            $userLanguage->setLevel(0);

            $em->persist($userLanguage);
            $em->flush();

Je peux voir à nouveau ton entité User ?

Ok, en effet dans ma classe User j'ai ça pour $language =>

/**
     * Get language
     * @return self
     */
    public function getLanguage()
    {
        return $this->language;
    }

    /**
     * Add language
     * @param UserLanguage $language
     * @return self
     */
    public function addLanguage(UserLanguage $language)
    {
        $this->language[] = $language;

        return $this;
    }

    /**
     * Remove language
     *
     * @param UserLanguage $language
     */
    public function removeLanguage(UserLanguage $language)
    {
        $this->language->removeElement($language);
    }

Si je met setLanguage à la place de add, ça passe mais apres erreur, car string donnée et non pas une classe UserLanguage, normal puisque que c'est la donnée du champ language du formulaire qui est envoyé par form...je tourne en rond.

Tu ne peux pas avoir un setLanguage, vu l'annotation que tu lui as donné.
Ecrit comme ci-dessus c'est correct.

Maintenant qu'elle est l'erreur lorsque tu laisse le addLanguage?

Dans ton RegistrationType , tu utilise la classe LanguageType. Quest-ce qu'il contient?
Pourquoi ne pas utilise l'EntityType ?

Ca devrait donner quelque chose comme ceci :


            ->add('language', EntityType::class, array(
                 'class' => Language::class,  
                'label' => 'register.label.language',
                'mapped' => false,
                 'required'=> true
                ))

Si je mets addLanguage j'ai => Could not determine access type for property "language" in class "App\Entity\User"..

LanguageType dans RegistrationType, c'est afin d'afficher un menu déroulant de toutes les langues, en gros c'est dans le systeme internationalisation de symfony : intl, il y a des .json de toutes les langues dans toutes les langues.

Test avec EntityType::class => Could not load type "App\Form\EntityType": class does not exist.

Oui c'est normal, tu dois ajouter le namespace correspondant :

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

Enfin il faut bien mettre l'option

'mapped' => false,

Car tu ne dois pas mettre la valeur Language dans le user directement, car il n'existe pas (C'est l'entité UserLanguage).

Je te suggère de changer le nom du champ d'ailleur, car il prête à confusion.
Tu as un champ language dans le User, qui pointe vers une entity UserLanguage.

Et dans ton formulaire tu demandes de créer un champ qui porte le même nom que ton champ de l'entité User. Bref, c'est confu rien qu'en l'expliquant.

ok, merci, je peux changer les champs dans User, et Language pour les nommés $userLanguage

Sinon erreur avec use ajouter => Catchable Fatal Error: Object of class App\Entity\Language could not be converted to string

edit : Sinon je le renomme seulement dans le form (et partout où il faut) en mettant allLanguages à la place de language pour éviter les confusion

Si je fais ça, la page s'affiche, ma liste déroulante est du coup rempli via la class Language, et donc qu'avec les codes... au lien de remplir la liste avec le json qui contient value = code et le nom de la langue afficher dans la langue du site.
si malgrès tout le m'inscrit =>
Type error: Argument 1 passed to App\Entity\UserLanguage::setLanguage() must be an instance of App\Entity\Language, array given, called in /var/www/html/skribascode/Projet5/src/Controller/RegistrationController.php on line 64

Si je fais ça =>

->add('allLanguages', LanguageType::class, array(
                //'class' => Language::class,  
                'label' => 'register.label.language',
                //'choice_label' => 'code',
                'mapped' => false,
                'required'=> true
                ))

Je retouve ma page d'inscription avec la liste de langue ok, mais apres toujours erreur =>
Type error: Argument 1 passed to App\Entity\UserLanguage::setLanguage() must be an instance of App\Entity\Language, array given, called in /var/www/html/skribascode/Projet5/src/Controller/RegistrationController.php on line 64

D'où le new languages sur lequel tu m'a interpellé plus haut suite au repository...je craque :-)

edit : Apres un dump($language) pour controler,
ça =>
$codeLanguage = $form->get('allLanguages')->getData();
$language = $em->getRepository(Language::class)->findByCode($codeLanguage);

        //$language= new Language($languageRepository);

array:1 [▼
0 => Language {#5040 ▶}
]

ARRRRRRRRRRRRRRRRRRrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrouuuuuuuuuuuuu ! Enfin un rengristrement c'est fait !

Pour reprendre => le controller =>

// Form Submitted
        if ($form->isSubmitted() && $form->isValid()) {

            //http://www.inanzzz.com/index.php/post/toza/many-to-many-association-example-in-symfony
            // Reste a voir pour les formType de chaque entity et les imbriquées

            $data = $form->getData();
            $em = $this->getDoctrine()->getManager();

            //USER
            // Encode the password
            $password = $passwordEncoder->encodePassword($user, $user->getPassword());
            // Save _locale of user
            $locale = $request->getLocale();
            // Create tokenRegister
            $tokenRegister = base64_encode(random_bytes(64));
            //Inject parameters for user
            $user->setTokenRegister($tokenRegister);
            $user->setLocale($locale);
            $user->setPassword($password);
            $user->setFirstConnection(new \DateTime('NOW'));

            $codeLanguage = $form->get('allLanguages')->getData();
            $language = $em->getRepository(Language::class)->findByCode($codeLanguage);
            //$language= new Language($languageRepository);
            //dump($languageRepository);

            $em->persist($user);

            //USERLANGUAGE
            $userLanguage = new UserLanguage();
            $userLanguage->setUser($user);
            $userLanguage->setLanguage($language[0]);
            $userLanguage->setLevel(0);

            $em->persist($userLanguage);
            $em->flush();
//-----------------

            // Voir créer event => https://blog.dev-web.io/2018/01/07/symfony-4-gestion-devenements/
            // Send confirmation mail with EmailProvider
            $emailRegister = $emailProvider->emailRegister($user);

            // Flash Message
            $this->addFlash('success',$this->get('translator')->trans('register.message.success'));

            // redirect to ...
            //return $this->redirectToRoute('index');
        }

registrationType

 public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', EmailType::class, array(
                'label' => 'register.label.email', 'required'=> true
                ))
            ->add('password', PasswordType::class, array(

                'label' => 'register.label.password', 'required'=> true
                ))
            ->add('nickname', TextType::class, array(
                'label' => 'register.label.nickname', 'required'=> true
                ))

            ->add('allLanguages', LanguageType::class, array(
                //'class' => Language::class,  
                'label' => 'register.label.language',
                //'choice_label' => 'code',
                'mapped' => false,
                'required'=> true
                ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => User::class
        ));
    }

J'ai un registrement dans ma table user_language dans la DB !
Maintenant comment je fais pour récupérer la langue de l'user, juste un getLanguage ?

C'est bon j'ai réussi !!
Merci beaucoup de m'avoir aidé !