微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我们想使用 symfony 和 api-platform 创建POST一个实体时出现的问题

如何解决当我们想使用 symfony 和 api-platform 创建POST一个实体时出现的问题

我正在使用 symfony 和 api-platform 开发一个 PHP 应用程序,当我想将数据保存在数据库中时遇到了问题。

我需要创建三个实体,即 Person、PersonCivility 和 PersonCivilityDetail。我还个性化了 Person 实体,以便对于每个 Person 实体,我们可以了解其当前的礼貌。所以我不得不使用 PersonCivilityDetailRepository Repository 来执行 sql 查询并将其注入到 Person 实体的构造函数中。这就是我在创建实体时遇到问题的地方。以下是不同类的代码摘录:

<?PHP

class Person
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(type="bigint")
     */
    private ?int $id = null;

    /**
     * @ORM\Column(type="string",length=255,nullable=true)
     */
    private ?string $firstName = null;

    /**
     * @ORM\Column(type="string",length=255)
     */
    private ?string $lastName = null;


    /**
     * @ORM\OnetoMany(targetEntity=PersonCivilityDetail::class,mappedBy="person",cascade={"persist"})
     * @var PersonCivilityDetail[]|ArrayCollection
     */
    private $personCivilityDetails;


    /**
     * @var PersonCivilityDetailRepository
     */
    private PersonCivilityDetailRepository $personCivilityDetailRepository;


    public function __construct(PersonCivilityDetailRepository $personCivilityDetailRepository)
    {
        $this->personCivilityDetails = new ArrayCollection();
        $this->personCivilityDetailRepository = $personCivilityDetailRepository;
    }

    /** 
     * others codes
     */


    /**
     * @return PersonCivility|null
     * @throws NonUniqueResultException
     */
    public function getCivility(): ?PersonCivility
    {
        return ($this->personCivilityDetailRepository
            ->findCivility($this)
        );
    }
}

个人文明

<?PHP
class PersonCivility
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(type="bigint")
     */
    private ?int $id = null;

    /**
     * @ORM\Column(type="string",length=10)
     */
    private ?string $abbreviation = null;

    /**
     * @ORM\Column(type="string",length=100)
     */
    private ?string $wording = null;

    /**
     * @ORM\OnetoMany(targetEntity=PersonCivilityDetail::class,mappedBy="personCivility")
     * @var PersonCivilityDetail[]|ArrayCollection
     */
    private $personCivilityDetails;

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

PersonCivilityDetail

<?PHP
class PersonCivilityDetail
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(type="bigint")
     */
    private ?int $id = null;

    /**
     * @ORM\ManyToOne(targetEntity=Person::class,inversedBy="personCivilityDetails")
     * @ORM\JoinColumn(nullable=false)
     */
    private ?Person $person = null;

    /**
     * @ORM\ManyToOne(targetEntity=PersonCivility::class,inversedBy="personCivilityDetails")
     * @ORM\JoinColumn(nullable=false)
     */
    private ?PersonCivility $personCivility = null;

    /**
     * @ORM\Column(type="datetime")
     */
    private ?DateTimeInterface $createdAt = null;

    /**
     * @ORM\Column(type="boolean")
     */
    private ?bool $isActual = null;
    
}

PersonCivilityDetailRepository

<?PHP
/**
 * @method PersonCivilityDetail|null find($id,$lockMode = null,$lockVersion = null)
 * @method PersonCivilityDetail|null findOneBy(array $criteria,array $orderBy = null)
 * @method PersonCivilityDetail[]    findAll()
 * @method PersonCivilityDetail[]    findBy(array $criteria,array $orderBy = null,$limit = null,$offset = null)
 */
class PersonCivilityDetailRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry,PersonCivilityDetail::class);
    }

    /**
     * @param Person $person
     * @return PersonCivility|null
     * @throws NonUniqueResultException
     */
    public function findCivility(Person $person): ?PersonCivility
    {
        return ($this->createqueryBuilder('personCivilityDetail')
            ->select('personCivility')
            ->join('personCivilityDetail.personCivility','personCivility')
            ->join('personCivilityDetail.person','person')
            ->where('personCivilityDetail.isActual = :personCivilityDetail_isActual')
            ->andWhere('person.id = :person_id')
            ->setParameters(['personCivilityDetail_isActual' => true,'person_id' => $person->getId()])
            ->getQuery()
            ->getoneOrNullResult()
        );
    }
}

这些是我的不同代码。当我执行 GET 操作时,我没有问题。当我执行 POST、PUT 或 PATCH 操作时,我遇到了问题。返回信息如下:

无法从序列化数据创建 App\Entity\Person 的实例,因为其构造函数需要存在参数“personCivilityDetailRepository”

我该怎么办?

另外,我想知道这种编码方式是否合适。你有更好的方法吗?

真诚的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。