Php 无法使用Symfony中的Set方法访问私有属性
我有一个带有get/set方法和私有属性的常规实体Php 无法使用Symfony中的Set方法访问私有属性,php,symfony,Php,Symfony,我有一个带有get/set方法和私有属性的常规实体 class Reservation { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string", length=190, nullable=true) */ private
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(),它应该是每个文档的。如果您将表单与这样的模型一起使用
$form = $this->createFormBuilder($reservation)
您应该使用模型方法,因为$form->getData()将是Reservation()的实例
因此,请尝试将代码更改为:
$reservation->setDuration($data->getDuration());
但是,您也可以使用
$form->getData()
对象本身。通过调用它,表单已经有了保留对象,当您调用HandlerRequest时,表单将设置对象上的所有(映射)数据(并使用其验证)
$form = $this->createFormBuilder($reservation)
这意味着这些线路不仅不成功,而且是问题的原因。$data->duration
试图访问预订对象的私有属性
$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()(如果这些方法不存在,它将尝试访问duration
属性)。-这是简化的,它实际上也会尝试其他一些“魔法”,但在这种情况下,它是准确的
现在,在提交表单并检查其有效性后,$form->getData()
将返回您提供的对象,其中包含前面所述的已设置的所有属性
更准确地说:您提供给createFormBuilder
的原始$reservation
已被修改,因此从技术上讲,您甚至不必调用getData()
总的来说,你有两个选择
a) 让您的生活更轻松,只需按照假定的命名方式命名表单上的所有字段。(意思是:->add('startingFromDate',…)
,因为您的getter和setter是camelCase)或
b) 不要使用保留
对象,而是使用普通对象甚至数组
您的问题最终归结为$data->duration
(以及其他访问)的$data
(这与$reservation
完全相同,因此duration
属性是私有的,因此$data->duration
是私有的,无法访问。提示:$data->duration是问题的根源。但是,如前所述,$reservation在表单发布时已经更新。因此不需要任何$data文件。请再次阅读文档中的示例。