如何解决当我们想使用 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 举报,一经查实,本站将立刻删除。