Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法使用Symfony中的Set方法访问私有属性_Php_Symfony - Fatal编程技术网

Php 无法使用Symfony中的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

我有一个带有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(),它应该是每个文档的。如果您将表单与这样的模型一起使用

$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文件。请再次阅读文档中的示例。