【问题标题】:Symfony - Can't get a way to read the property (PropertyAccessor)Symfony - 无法读取属性(PropertyAccessor)
【发布时间】:2021-09-22 13:25:36
【问题描述】:

我使用 symfony 开发了一个创建票证的表单,但是当我尝试时出现此错误:

来自文件tickettype.php的我的函数buildform:

public function buildForm(FormBuilderInterface $builder, array $options)
{
  $builder
    ->add('Titre', TextType::class)
    ->add('Message', TextType::class)
    ->add('Date', DateTimeType::class, ['data' => new \DateTime()] )
    ->add('Demandeur', EntityType::class, [
      'class' => Client::class,
      'choice_label' => 'Nom',
     ])
     ->add('Agent', EntityType::class, [
       'class' => Dealer::class,
       'choice_label' => 'Nom',
     ])
     ->add('Etat_Ticket', EntityType::class, [
       'class' => Etat::class,
       'choice_label' => 'Statut',
     ]);
}

在控制器中:

/**
 * @Route("/add/", name="add_ticket")
 *
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function addTicketAction(Request $request)
{
  $ticket = new Ticket();
  $form = $this->createForm(TicketType::class, $ticket);
  $form->add('send', SubmitType::class, ['label' => 'créé un nouveau ticket']);
  $form->handleRequest($request);
    
  if($form->isSubmitted()){
    $ticket->setDate(new \DateTime());
    $em = $this->getDoctrine()->getManager();
    $em->persist($ticket);
    $em->flush();
    
    return $this->redirectToRoute('List_ticket');
  }
    
  return $this->render("add.html.twig", array('form' => $form->createView())); 
}

而我的实体 Ticket 有这个属性:

/**
 * @ORM\ManyToOne(targetEntity=Etat::class, inversedBy="Etat_Ticket")
 * @ORM\JoinColumn(nullable=false)
 */
private $Etat_Ticket;

链接到实体 Etat,如下所示:

/**
 * Etat
 *
 * @ORM\Table(name="etat")
 * @ORM\Entity
 */
 class Etat
 {
   /**
    * @var int
    *
    * @ORM\Column(name="id", type="integer", nullable=false)
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="IDENTITY")
    */
    private $id;

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

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

    public function getStatut(): ?string
    {
      return $this->statut;
    }

    public function setStatut(string $statut): self
    {
      $this->statut = $statut;

      return $this;
    }
 }

【问题讨论】:

  • 为什么属性 etat_ticket 在注解中是自反的?好像打错了。

标签: symfony properties entity


【解决方案1】:

你没有Etat_Ticket 属性的getter,所以symfony(这是一个PHP 通用规则,当属性不公开时)不能从类范围之外读取它的值。这里的 Symfony 表单组件默认尝试使用 getter 或直接访问公共属性,并且由于既没有找到 getter 也没有找到公共属性,因此它不知道如何检索该值。

您可以自己填写表单 (docs) 或使用 property_path

还请记住,将实体(或通常是域模型)直接绑定到表单对 RAD(快速应用程序开发)有好处,但从长远来看并不是那么好。我建议使用一种 DTO 来读取和写入模型(查看here 以了解这个概念)

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 2011-01-07
    • 2022-01-22
    • 2018-05-13
    • 2015-03-29
    • 2018-07-04
    • 2018-11-29
    相关资源
    最近更新 更多