Bonjour,
J'utilise Symfony 3.4.7 .
Je travaille avec 3 tables, un article, une catégorie, et une table de relation articles_categories.
Je souhaite pouvoir Ajouter/Editer des articles, sachant qu'un article peut avoir appartenir à plusieurs Catégories et inversement. J'ai des attributs qui sont propres à la relation, c'est pour cela que j'ai crée une entité articles_categories qui fait la relation entre la catégories et l'articles et que je ne l'exprime pas par une relation directe entre les deux entités Articles, Catégories.

Voici le code de mon entité Articles :

/**
 * Articles
 *
 * @ORM\Table(name="articles")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ArticlesRepository")
 */
class Articles
{
    /**
     * @var string
     *
     * @ORM\Column(name="code_article", type="string", length=10)
     * @ORM\Id
     */
    private $codeArticle;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text", nullable=true)
     */
    private $description;

    /**
     * @var ArticlesCategories
     *
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\ArticlesCategories", mappedBy="codeArticle")
     */
    private $articlesCategories;
    // getters et setters normaux

    /**
     * Add articlesCategorie
     *
     * @param ArticlesCategories $articleCategorie
     *
     * @return Articles
     */
    public function addArticlesCategorie(ArticlesCategories $articleCategorie){
        $this->articlesCategories[] = $articleCategorie;
        $articleCategorie->setCodeArticle($this);

        return $this;
    }

    /**
     * remove articlesCategorie
     *
     * @param ArticlesCategories $articlesCategorie
     */
    public function removeArticlesCategorie(ArticlesCategories $articlesCategorie){
        $this->articlesCategories->removeElement($articlesCategorie);
    }

    /**
     * Get articlesCategories
     *
     * @return Collection
     */
    public function getArticlesCategories(){
        return $this->articlesCategories;
    }

    public function __toString()
    {
        return $this->codeArticle;
    }

    public function __construct()
    {
        $this->articlesCategories = new ArrayCollection();
    }

Et le code de mon entité ArticlesCatgories :

/**
 * ArticlesCategories
 *
 * @ORM\Table(name="articles_categories")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ArticlesCategoriesRepository")
 */
class ArticlesCategories
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Articles", inversedBy="articlesCategories")
     * @ORM\JoinColumn(referencedColumnName="code_article", nullable=false)
     */
    private $codeArticle;

    /**
     * @var string
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Categories")
     * @ORM\JoinColumn(referencedColumnName="reference", nullable=false)
     */
    private $codeCategorie;

    /**
     * @var string
     *
     * @ORM\Column(name="critere_rech_1", type="string", length=45, nullable=true)
     */
    private $critereRech1;

    /**
     * @var string
     *
     * @ORM\Column(name="critere_rech_2", type="string", length=45, nullable=true)
     */
    private $critereRech2;

    //getter et setter normaux

Et mon entité Categories n'a rien de spécifique.

J'ai générer automatiquement le crud de mon entité Articles et j'ai ensuite modifier ma classe ArticlesType afin d'avoir tous les attributs de ma relation ArticlesCategories qui s'affichent. Pour faire cette modification j'ai utilisé CollectionType.

Voici le code de mon formulaire ArticlesType :

class ArticlesType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('codeArticle')
            ->add('description')
            ->add('ecotaxe')
            ->add('qteMaxCde')
            ->add('publication')
            ->add('designation')
            ->add('taxonomie')
            ->add('referenceStock')
            ->add('articleRegroupement')
            ->add('articleAssocie1')
            ->add('articleAssocie2')
            ->add('articleAssocie3')
            ->add('seuilDegressif')
            ->add('tauxDegressif')
            ->add('articlesCategories', CollectionType::class, array(
                'entry_type' => ArticlesCategoriesType::class,
                'allow_add' => true,
                'allow_delete' => true,
                'prototype' => true,
                'by_reference' => false,
                'label' => 'test',
                'attr' => array('class' => 'collection-articlesCategories'),
                'auto_initialize' => true
            ));
    }

    public function getName(){
        return 'Articles';
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Articles'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'appbundle_articles';
    }

}

Lorsque je vais sur ma page générée automatiquement par symfony d'édition d'un article j'obtiens l'affichage souhaité.
Cependant lorsque je clique sur le bouton "edit" pour valider les modifications, j'obtiens cette erreur : Could not determine access type for property "articlesCategories" in class "AppBundle\Entity\Articles".

J'ai pourtant l'impression que j'ai exprimé correctement la relation entre mes entités. Je ne vois pas où est mon erreur.

J'espère avoir été assez claire.
Je vous remercie de votre future aide !

5 réponses


Balbert
Réponse acceptée

Hello

Es tu sûres d'avoir le setter setArticlesCategories  dans l'entité Articles ?


function setArticlesCategories($articlesCategories) {

$this->articlesCategories = $articlesCategories;

return $this;

}

c'est normal les "..." dans le fichier qui contient la classe Articles ? ca serai pas ca ton souci ?

private $articlesCategories;
// getters et setters normaux
...
/**

Sinon, un numéro de ligne eventuellement avec l'erreur ? on dirai qu'il arrive pas a comprendre le mot clé private ... bizarre...

Sgothan
Auteur

Tout d'abord merci pour ta réponse.
Et les "..." c'est une erreur de recopie. Dans mon code je ne les aient pas ces trois points.
Pourquoi il ne comprendrait pas le mot clé "private" pour cet attribut alors qu'il le comprend pour les autres attributs?
Merci.

Sgothan
Auteur

Bonjour,
En effet, je n'avais pas mis setArticleCategories(...) dans mon entité Articles. Je pensais qu'avec mes fonctions remove, add et get je n'avais pas beoin de mettre le set sur cet attribut.
Après l'ajout de la fonction setArticlesCategories() dans mon entité, je n'ai plus l'erreur à la validation de mon formulaire.
Merci à tous pour votre aide !

La commande suivante pourra t'aider dans le futur, elle génère les getter/setter d'un bundle (au niveau de chaque entités).

C'est une des première commande que tu lance dans le type d'erreur que tu as ou dans tu modifies les données encapsulées dans tes entités.

php bin/console doctrine:generate:entities BundleName