Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.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 Symfony2验证(yml)已忽略_Php_Validation_Symfony - Fatal编程技术网

Php Symfony2验证(yml)已忽略

Php Symfony2验证(yml)已忽略,php,validation,symfony,Php,Validation,Symfony,我在bundles Resources/config目录中设置了validation.yml。我在我的config.yml中启用了验证程序的使用: framework: validation: { enabled: true, enable_annotations: false } Resources/config/validation.yml: MyBundle\AppBundle\Handler\SearchModel: properties: search

我在bundles Resources/config目录中设置了validation.yml。我在我的config.yml中启用了验证程序的使用:

framework:
    validation: { enabled: true, enable_annotations: false }
Resources/config/validation.yml:

MyBundle\AppBundle\Handler\SearchModel:
    properties:
        search:
            - Length:
                min: 2
                max: 50
                minMessage: "Your string must be at least {{ limit }} characters long"
                maxMessage: "Your string cannot be longer than {{ limit }} characters long"
在我的控制器中,我正在执行以下操作:

$validator = $this->get('validator');
$errors = $validator->validate($searchModel);
我非常确定(因为我仔细检查过)要验证的模型的属性是string(1)1char。(应至少为2!)

但是$errors的var_dump()表示:

object(Symfony\Component\Validator\ConstraintViolationList)#327 (1) {
["violations":"Symfony\Component\Validator\ConstraintViolationList":private]=>
    array(0) {
    }
}
因此,不会抛出错误。我怎样才能解决这个问题?我希望验证器工作:)

更新

我(现在)用一种变通方法使它起作用。我向(SearchModel)类添加了一个loadValidatorMetaData方法以进行验证

public static function loadValidatorMetadata(ClassMetadata $metadata)
{
    $metadata
        ->addPropertyConstraint(
            'search',
            new Assert\Length(
                array('min' => 2, 'minMessage' => 'Error message.')
            )
        );
}

检查$validator->validate($searchModel)时;它返回错误,因此验证工作正常。但对于.yml文件则不是这样:(

我设置了一个小测试用例,但没有出现错误。我添加了一个NotBlank约束,当搜索为空时出现了一个错误

Acme\DemoBundle\Command\SearchModel:
properties:
    search:
        - Length:
            min: 2
            max: 5
            minMessage: "Your string must be at least {{ limit }} characters long"
            maxMessage: "Your string cannot be longer than {{ limit }} characters long"
        - NotBlank: ~
然后我将搜索设置为一个字符

class SearchModel
{
    public $search = 'a';
}
它触发了最小长度错误

我通读了长度文档:。确实,长度为零的字符串应该会触发错误

在任何情况下,添加一个NotBlank约束,您就可以开始了

我检查了代码:

namespace Symfony\Component\Validator\Constraints;

class LengthValidator extends ConstraintValidator
{

public function validate($value, Constraint $constraint)
{
    if (null === $value || '' === $value) {
        return;
    }

因此,我想这就是所谓的未记录的“功能”。字符串长度为零不被认为小于min!请好奇是否有关于此的错误报告。但是,NotBlank也可以。您可以随时调整错误消息,以便用户知道限制。

从文档中的示例开始:.Replace's通过使用您的搜索模型的新实例进行测试,可以绝对确定。缓存可能需要清除。并且您的验证文件位于加载到AppKernel中的Symfony 2捆绑包中?感谢您的回答。我重新测试了它,清除了正确环境的缓存。而且我的validation.yml看起来正确。仍然没有任何内容。可能吗e它是否仅适用于实体目录中的模型?它将适用于所有对象。请仔细检查完全限定的名称。可能名称空间中有键入错误?MyBundle\AppBundle有点可疑。我本应使用MyProject\AppBundle。您确定MyBundle\AppBundle是正确的名称空间吗?您使用了一个公共变量。我应该使用该变量进行测试好的。我正在使用私有变量。可能是这样吗?不。反射用于访问私有变量。只要您确定类名正确,非空应该可以工作。使用dir(get_class($searchModel))来确认。