2017-06-20 40 views
0

我正在使用Symfony验证来完成对我的模型(基本PHP类)的验证。当我尝试执行验证,有人告诉我,我的YAML文件必须包含一个YAML阵列,为什么我为Symfony验证yaml文件获取“必须包含YAML数组”?

InvalidArgumentException: The file "/Users/me/git/project123/app/Lib//Acme/SiteList/Model/validations.yml" must contain a YAML array.

我的Symfony验证YAML看起来像这样(使用4个空格缩进),

Acme\SiteList\Model\SiteListItem: 
    properties: 
     siteListId: 
      - NotBlank: ~ 

Acme\SiteList\Model\SiteList: 
    properties: 
     name: 
      - NotBlank: ~ 

解析YAML验证文件看起来像这样,

array(2) { 
    ["Acme\SiteList\Model\SiteListItem"]=> 
    array(1) { 
    ["properties"]=> 
    array(1) { 
     ["siteListId"]=> 
     array(1) { 
     [0]=> 
     array(1) { 
      ["NotBlank"]=> 
      NULL 
     } 
     } 
    } 
    } 
    ["Acme\SiteList\Model\SiteList"]=> 
    array(1) { 
    ["properties"]=> 
    array(1) { 
     ["name"]=> 
     array(1) { 
     [0]=> 
     array(1) { 
      ["NotBlank"]=> 
      NULL 
     } 
     } 
    } 
    } 
} 

我通过这个执行验证,

public function validate(SiteListItem $model) 
{ 
    $validationsPath = APPLIBS . DS . 'Acme/SiteList/Model/validations.yml'; 

    $parsed = Yaml::parse(file_get_contents($validationsPath)); 
    var_dump($parsed); 

    $validator = Validation::createValidatorBuilder() 
     ->addYamlMapping($validationsPath) 
     ->getValidator(); 

    /** @var ConstraintViolationList $violations */ 
    $violations = $validator->validate($model); 

    return $violations; 
} 
+0

我想你还有别的事情在这里。我复制/粘贴您的validations.yml文件,一切似乎都正常工作。我怀疑你的验证文件中可能有额外的未发布的行?错误消息来自YamlFileLoader :: parseFile()我想你可以通过在那里粘贴调试语句开始。 – Cerad

回答

0

有没有这样的事情作为YAML阵列。 YAML有序列(节点列表)和映射(一组键值对)。在这个错误消息中使用术语数组是Symfony作者的一个坏主意,因为PHP中的array是大多数其他语言中称为哈希表的。

话虽这么说,这个问题recides在您的路径:

/Users/me/git/project123/app/Lib//Acme/SiteList/Model/validations.yml 
           ^^ 

这双斜线可能阻止Symfony的加载文件。由此产生的错误当然不是我期望的这种输入。

+1

你会得到一个“文件不存在”,是加载程序找不到该文件。双斜杠不是问题。 – Cerad