[英]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.