【问题标题】:Why am I getting a "must contain a YAML array" for Symfony Validation yaml file?为什么我得到 Symfony 验证 yaml 文件的“必须包含 YAML 数组”?
【发布时间】:2017-06-20 21:55:24
【问题描述】:

我正在使用 Symfony Validation 对我的模型(基本 PHP 类)进行验证。当我尝试执行验证时,我被告知我的 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;
}

【问题讨论】:

  • 我认为您这里还有其他事情要做。我复制/粘贴了您的 validations.yml 文件,一切似乎都运行良好。我怀疑您的验证文件中可能还有其他未发布的行?错误消息来自 YamlFileLoader::parseFile() 我想你可以从那里粘贴一个调试语句开始。
  • 我认为问题出在 YamlLoader 中。其中哪一个在这里使用?我最近遇到了一个问题,我在路由下使用了一个,而不是在翻译组件下使用了一个。希望对您有所帮助。

标签: php symfony validation yaml symfony-validator


【解决方案1】:

没有YAML 数组这样的东西。 YAML 有 sequences(节点列表)和 mappings(键值对集)。在此错误消息中使用术语 array 对 Symfony 作者来说是个坏主意,因为 PHP 中的 array 在大多数其他语言中被称为哈希表。

话虽如此,问题出在你的道路上:

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

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

【讨论】:

  • 你会得到一个“文件不存在”是加载器找不到文件。双斜线不是问题。
【解决方案2】:

有点旧,但以防万一,也许您省略(或保持注释)您的 routes.yml 文件的第一行?

#index:
    path: /
    controller: App\Controller\HomeController::index

不起作用并给你这个错误。

index:
    path: /
    controller: App\Controller\HomeController::index

是正确的。 希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-05
    • 2019-01-30
    • 1970-01-01
    • 2011-01-17
    • 2017-05-19
    • 1970-01-01
    • 2018-11-27
    • 2021-05-05
    相关资源
    最近更新 更多