如何更改 symfony2 形式的输入必需属性?

How to changes input required attribute in symfony2 form?

我在添加和编辑页面上使用了一个表单,其中有一个输入文件是添加记录所必需的,但在编辑页面上不需要。有没有办法改变不同页面的属性?

        $builder->add('title', 'text', array(
        'required' => true,
    ))->add('description', 'textarea', array(
        'required' => false,
    ))->add('fileName', 'file', array(
        'data_class' => null,
        'required' => true,
        'label' => 'Upload File'
    ));

这是我的控制器

        if ($custFile === null) {
        $custFile = new File();
    }

    $fileForm = $this->createForm(new CustomerFileType(), $custFile);
    $fileForm->handleRequest($request);
    if ($fileForm->isValid()) {
        $data = $fileForm->getData();
        $custFile->setUserType('customer');
        $custFile->setUserId($request->get('id'));
        $custFile->setDateAttached($data->date);

        $om->persist($data);

        $file = $custFile->getFileName();
        if ($file instanceof UploadedFile) {
            $uploadManager = $this->get('probus_upload.upload_manager.user_files');
            if ($newFileName = $uploadManager->move($file)) {
                $custFile->setFileName(basename($newFileName));
            }
        }

        $om->flush();

        return $this->redirect($this->generateUrl('minicasp_customer_edit_customer', array(
                            'id' => $request->get('id'),
        )));
    }
            $fileRecord = array();
    if (null !== $customer) {
        $fileRecord = $om->createQueryBuilder()
                ->from('MinicaspCustomerBundle:file', 'f')
                ->select('f')
                ->where('f.userId = :customer')
                ->andWhere('f.userType = :userType')
                ->orderBy('f.id', 'DESC')
                ->setParameter('customer', $request->get('id'))
                ->setParameter('userType', 'customer')
                ->getQuery()
                ->getResult()
        ;
    }

    return $this->render('MinicaspCustomerBundle:Default:customerAccount.html.twig', array(
                'form' => $form->createView(),
                'payment_form' => $paymentForm->createView(),
                'file_form' => $fileForm->createView(),
                'payments' => $payments,
                'file_record' => $fileRecord,
                'file_edit' => $fileEdit
    ));

您可以使用不同的选项创建两种表单类型。

附带说明一下,您不需要输入 "required => true" 这是默认选项,

在表单 class 中获取您的对象并检查您是否添加或编辑新记录,并据此设置 "required" 属性的值:

$obj = $builder->getData();

$builder->add('fileName', 'file', array(
    'data_class' => null,
    'required' => $obj->getId() === null ? true : false,
    'label' => 'Upload File'
));

@Umair Malik,根据你最后的评论,你可以在你的控制器中试试这个:

if ($request->getMethod() == 'POST') {
     $form->submit($request);

    $formData = $form->getData();
    if ($formData->getFile() !== null){
        /*
         * New file has been uploaded
         * Save or copy your old record; after this will be over-written
         */
    }

    $entityManager->persist($formData);                                
    $entityManager->flush(); 
}