预期参数类型为“App\Entity\Modulo”,在属性路径“modulos”处给出“string”

问题描述 投票:0回答:1

`当我尝试添加与模数具有多对多关系的 acao (课程)新记录时,我收到错误预期参数类型为“App\Entity\Modulo”,在属性路径中给出“字符串”模”。

阿果班

<pre><code>
<?php

namespace App\Entity;

use App\Repository\AcaoRepository;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

#[ORM\Entity(repositoryClass: AcaoRepository::class)]
class Acao
{   
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column]
    private ?int $number = null;

    #[ORM\Column(length: 255)]
    private ?string $nome = null;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getNumber(): ?int
    {
        return $this->number;
    }

    public function setNumber(int $number): self
    {
        $this->number = $number;
        return $this;
    }

    public function getNome(): ?string
    {
        return $this->nome;
    }

    public function setNome(string $nome): self
    {
        $this->nome = $nome;
        return $this;
    }

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Modulo")
     * @ORM\JoinTable(name="acao_modulo",
     *      joinColumns={@ORM\JoinColumn(name="acao_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="modulo_id", referencedColumnName="id")}
     * )
     */
    private $modulos;

    // ...

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

    /**
     * @return Collection|Modulo[]
     */
    public function getModulos(): Collection
    {
        return $this->modulos ?: new ArrayCollection();
    }

    public function addModulo(Modulo $modulo): self
    {
        if (!$this->modulos->contains($modulo)) {
            $this->modulos[] = $modulo;
        }

        return $this;
    }

    public function removeModulo(Modulo $modulo): self
    {
        $this->modulos->removeElement($modulo);

        return $this;
    }

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


AcaoControllerCRUD
<?php

namespace App\Controller\Admin;

use App\Entity\Acao;
use App\Form\ModuloType;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ArrayField;


class AcaoCrudController extends AbstractCrudController
{
    public static function getEntityFqcn(): string
    {
        return Acao::class;
    }

    
    public function configureFields(string $pageName): iterable
    {
        return [
            NumberField::new('number'),
            TextField::new('nome'),
            
            // Define the Many-to-Many relationship field
            CollectionField::new('modulos')
                //->setEntryType(ModuloType::class) // Replace ModuloType with your form type for Modulo entity
                ->setEntryIsComplex(false) // Set to true if related entity is complex
                ->setFormTypeOptions([
                    'by_reference' => false, // Ensure that the form is processed correctly for Many-to-Many
                ])
                ->onlyOnForms(), // Display this field only on forms
        ];
    }

}

ModuloEntity

<?php

namespace App\Entity;

use App\Repository\ModuloRepository;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

#[ORM\Entity(repositoryClass: ModuloRepository::class)]
class Modulo
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column]
    private ?int $number = null;

    #[ORM\Column(length: 255)]
    private ?string $nome = null;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getNumber(): ?int
    {
        return $this->number;
    }

    public function setNumber(int $number): static
    {
        $this->number = $number;

        return $this;
    }

    public function getNome(): ?string
    {
        return $this->nome;
    }

    public function setNome(string $nome): static
    {
        $this->nome = $nome;

        return $this;
    }

    /**
     * @ORM\ManyToMany(targetEntity=Acao::class, mappedBy="modulos")
     */
    private $acoes;

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

    /**
     * @return Collection|Acao[]
     */
    public function getAcoes(): Collection
    {
        return $this->acoes;
    }

    public function addAcao(Acao $acao): self
    {
        if (!$this->acoes->contains($acao)) {
            $this->acoes[] = $acao;
            $acao->addModulo($this);
        }

        return $this;
    }

    public function removeAcao(Acao $acao): self
    {
        if ($this->acoes->removeElement($acao)) {
            $acao->removeModulo($this);
        }

        return $this;
    }
}


</code></pre>

我不明白我遇到的错误。我在我的 CRUD 控制器中传递了一个模数实例,而不是一个字符串。

symfony easyadmin
1个回答
0
投票

我认为你可以在 CRUD 控制器中尝试使用 AssociationField 而不是 CollectionField:

<?php

namespace App\Controller\Admin;

use App\Entity\Acao;
use App\Form\ModuloType;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ArrayField;


class AcaoCrudController extends AbstractCrudController
{
    public static function getEntityFqcn(): string
    {
        return Acao::class;
    }

    
    public function configureFields(string $pageName): iterable
    {
        return [
            NumberField::new('number'),
            TextField::new('nome'),
            
            // Define the Many-to-Many relationship field
            AssociationField::new('modulos')
// Add your Options here
               
        ];
    }

}

这样 EasyAdmin 将映射您的 CRUD 中的实体。 我希望这会有所帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.