繁体   English   中英

无法在Symfony中使用Set方法访问私有属性

[英]Cannot access private property with Set method in Symfony

我有带有get / set方法和私有属性的常规实体。

class Reservation
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=190, nullable=true)
     */
    private $duration;

    /**
     * @ORM\Column(type="date")
     */
    private $starting_from_date;

    /**
     * @ORM\Column(type="date")
     */
    private $until_date;

    /**
     * @ORM\Column(type="integer")
     */
    private $guests_number;

    public function getDuration(): ?string
    {
        return $this->duration;
    }

    public function setDuration(?string $duration): self
    {
        $this->duration = $duration;

        return $this;
    }

    public function getStartingFromDate(): ?\DateTimeInterface
    {
        return $this->starting_from_date;
    }

    public function setStartingFromDate(\DateTimeInterface $starting_from_date): self
    {
        $this->starting_from_date = $starting_from_date;

        return $this;
    }

    public function getUntilDate(): ?\DateTimeInterface
    {
        return $this->until_date;
    }

    public function setUntilDate(\DateTimeInterface $until_date): self
    {
        $this->until_date = $until_date;

        return $this;
    }

    public function getGuestsNumber(): ?int
    {
        return $this->guests_number;
    }

    public function setGuestsNumber(int $guests_number): self
    {
        $this->guests_number = $guests_number;

        return $this;
    }

我只是想用以下方法创建新的对象:

 * @Route("/reservation/new", name="new_reservation")
 * Method({"GET","POST"})
 */
public function create(Request $request)
{
    $reservation = new Reservation();

    $form = $this->createFormBuilder($reservation)
                 ->add('duration', TextType::class, array('attr' => array('class' => 'form-control')))
                 ->add('starting_from_date', DateType::class, array('attr' => array('class'=> 'form-control')))
                 ->add('until_date', DateType::class, array('attr' => array('class'=> 'form-control')))         
                 ->add('guests_number', TextType::class, array('attr' => array('class'=> 'form-control')))                    
                 ->add('save', SubmitType::class, array('label' => 'Create', 'attr' => array('class'=>'btn btn-primary mt-3') ))
                 ->getForm();

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        $data = $form->getData();

        $entityManager = $this->getDoctrine()->getManager();

        $reservation->setDuration($data->duration);            
        $reservation->setStartingFromDate($data->starting_from_date);
        $reservation->setUntilDate($data->until_date);            
        $reservation->setGuestsNumber($data->guests_number);   

        $entityManager->persist($reservation);
        $entityManager->flush();

        return $this->redirectToRoute('reservation');
    }

    return $this->render(
        'user/new.html.twig', ['form'=> $form->createView()
    ]);
    return $this->render(
        'reservation/new.html.twig', array('form'=> $form->createView())
    );
}

我收到“无法访问私有属性App \\ Entity \\ Reservation :: $ duration”,由于我尝试使用setDuration(),因此我不清楚原因为何,因为setDuration()应该根据文档进行。

如果您将表单与这样的模型一起使用

$form = $this->createFormBuilder($reservation)

您应该使用模型方法,因为$ form-> getData()将是Reservation()的实例。

因此,尝试将代码更改为此:

$reservation->setDuration($data->getDuration());  

但是也许您也可以使用$form->getData()对象本身。

通过调用此方法,表单已经具有保留对象,并且在调用handleRequest时将设置该对象上的所有(映射)数据(并使用其验证)。

    $form = $this->createFormBuilder($reservation)

这意味着这些行不仅不必要,而且是造成问题的原因。 $data->duration是尝试访问Reservation对象的私有属性。

    $reservation->setDuration($data->duration);            
    $reservation->setStartingFromDate($data->starting_from_date);
    $reservation->setUntilDate($data->until_date);            
    $reservation->setGuestsNumber($data->guests_number);  

表单组件实际上很聪明。 如果您提供一个对象(在您的情况下$reservation )并告诉表单它具有字段duration->add('duration', ...) ),它将尝试在$reservation上调用setDuration()来设置值和getDuration()获取它(如果这些方法不存在,它将尝试访问duration属性)。 -简化了,实际上它也会尝试其他“魔术”,但是在这种情况下是准确的。

现在,提交表单并检查其有效性之后, $form->getData()将返回您提供的对象,该对象具有$form->getData()所有已设置属性。

更精确地说:您为createFormBuilder提供的原始$reservation已修改,因此从技术上讲,您甚至不必调用getData()

总体而言,您有两种选择

a)通过以假定命名的相同方式命名表单上的所有字段,使您的生活更轻松。 (意思是: ->add('startingFromDate', ...) ,因为您的获取器和设置器都是camelCase)或

b)不要使用Reservation对象,而要使用普通对象甚至数组。

你的问题最终归结到$data->duration的(以及其他访问) $data (这是绝对等同于$reserveration ,因此duration属性是私有的,所以$data->duration是私人的,不能访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM