【问题标题】:Form validation ignores empty value表单验证忽略空值
【发布时间】:2018-08-05 22:25:18
【问题描述】:

表单类型:

class BranchFormType extends AbstractType {

 public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('name');
    }

    public function getName() {
        return 'branch';
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'My\MainBundle\Entity\Branch',
        ));
    }

}

在实体定义中:

<field name="name" column="name" type="string" length="255"/>

没有 nullable=true 并且该字段在呈现时具有必需的属性。

验证.yml:

My\MainBundle\Entity\Branch:
    properties:
        name:
            - NotBlank: ~

symfony 是自动找到这个文件还是我必须包含在某个地方?文档只是声明表单自动使用验证服务。

控制器:

    $branch = new Branch();
    $form = $this->createForm(new BranchFormType(), $branch);

    if ($request->isMethod('POST')) {

        $form->bindRequest($request);

        if ($form->isValid()) {
            $em->persist($branch);
            $em->flush();

            return $this->redirect($this->generateUrl('view_branch'));
        }
    }

    return $this->render('MyMainBundle:Branch:create.html.twig', array(
                'form' => $form->createView()
            ));

提交时出现以下错误:

SQLSTATE[23000]:违反完整性约束:1048 列“名称” 不能为空

因此,尽管 name 为空,但 isValid 返回 true 并继续使用空值保存实体。名称为空时,isValid如何返回true? ORM定义说nullable=false?`有什么想法吗?我没有定义额外的验证器。我用的是sf2.1

【问题讨论】:

  • nullable=false 是一个 Doctrine 约束,isValid 不执行 Doctrine 方面的检查(Doctrine 不知道如何验证实体),它只检查断言(NotBlank...)来自 Validator 组件。
  • 我猜可能存在级联持续存在的问题。假设您的分支实体与另一个具有“名称”字段的实体(具有级联持久性)有关系。在您的情况下,如果您为 Branch 实体中的“名称”字段设置值但未在相关实体中设置“名称”字段,您将遇到与您描述的相同的错误。那么你能确保你的关系不会导致这个错误吗?如果您发布分支实体定义,我可能会说更多
  • 你可能是对的,在 sf 工具栏中有一个实体错误,例如“children 指的是不存在的拥有侧字段 Kloppe\SmsBundle\Entity\User#user。”这是实体定义dpaste.com/879513
  • 我认为你需要required=true 形式
  • 您的分支定义是否定义了getBranch()setBranch() 方法?

标签: symfony symfony-2.1 symfony-forms


【解决方案1】:

看起来验证文件在正确的文件夹中:

src/My/MainBundle/Resources/config/validation.yml

确保您没有使用验证组?

无论如何,我会使用Assert 来看看这个验证文件是否有问题:

启用注释:

# app/config/config.yml
framework:
    validation: { enable_annotations: true }

设置您的实体:

namespace My\MainBundle\Entity\;

use Symfony\Component\Validator\Constraints as Assert;
//...

class Branch{

    /**
     * @Assert\NotBlank
     */
    protected $name;

}

你可以试试这个吗?

此外,您可以从控制器中像这样测试验证:

// ...
use My\MainBundle\Entity\Branch;

public function indexAction()
{
    $branch = new Branch();

    $branch->setName('');

    $validator = $this->get('validator');
    $errors = $validator->validate($branch);

    if (count($errors) > 0) {
        return new Response(print_r($errors, true));
    } else {
        return new Response('Entity is valid');
    }
}

【讨论】:

    【解决方案2】:

    使用NotBlankValidation约束

    【讨论】:

    • 我有这个限制,但是我收到了这个消息。
    • 你的validation.yml文件命名是否正确(小写)?
    • 嗯。完整的路径是什么?
    • \src\My\MainBundle\Resources\config
    【解决方案3】:

    您应该检查验证服务是否正确地聚合了您的映射:

    $validator = $this->container->get('validator'); // do it your way
    
    $metadata = $validator->getMetadataFactory()->getClassMetaData('My\\MainBundle\\Entity\\Branch');
    
    var_dump($metadata);
    

    这将允许您检查您的 yml 配置是否已被考虑在内。

    如果不是,请检查用于命名和放置验证 yml 文件的约定,即使看起来没问题。

    【讨论】:

    • 只是为了补充那个很好的答案@Florian,因此人们可以查看像这样的受限属性:$metadata-&gt;getConstrainedProperties() 或查看像 var_dump($metadata-&gt;getMemberMetadatas('name')) 这样的特定属性,例如 @ 987654324@ 财产。见Symfony\Component\Validator\Mapping\ClassMetadata
    【解决方案4】:

    尝试在 NotBlank 之外添加 NotNull 约束。

    【讨论】:

      【解决方案5】:

      自创建 validation.yml 以来,您是否尝试过清除开发缓存?我也有类似的挫败感,这为我解决了一切问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 2021-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多