在 Symfony3 中加载自定义验证 yml

问题描述 投票:0回答:2

我正在使用 Symfony3(与 SonataAdminBundle 一起),并且我需要创建一些验证文件。由于我有多个实体,并且我想将验证 yml 文件拆分为每个实体一个,因此我想使用依赖项注入加载器来加载这些文件。现在,我的问题是:

  1. 如果我为验证文件创建自定义加载器,我是否还需要手动加载 services.yml 和routing.yml?

  2. 我的代码是否存在任何明显的问题会导致以下错误?

YamlFileLoader.php 第 404 行中的 InvalidArgumentException:没有 扩展能够加载配置 “UserAdminBundle\Entity\User”(在 *****src/UserAdminBundle/DependencyInjection/../Resources/config/validation/validation.yml)。 查找命名空间“UserAdminBundle\Entity\User”,没有找到

我的文件:

UserAdminBundle\Entity\User:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
            fields: [email]
            message: 'This user already exists'
UserAdminBundle\Entity\TaxToReseller:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
            fields: [resellerId, taxId]
            message: 'Reseller already has this tax'
UserAdminBundle\Entity\Tax:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
            fields: [ name, value ]
            message: 'This tax already exists'

我的加载方法:

public function load(array $configs, ContainerBuilder $container)
{

    $loader = new YamlFileLoader(
        $container,
        new FileLocator(__DIR__.'/../Resources/config')
    );

    //$loader->load('validation/validation.yml');
    $loader->load('validation/agent_validation.yml');
    $loader->load('validation/call_centre_validation.yml');
    $loader->load('validation/reseller_header_validation.yml');
    $loader->load('validation/reseller_validation.yml');
    $loader->load('validation/tax_validation.yml');

}

我可以用一些想法来解释为什么它找不到东西!

提前致谢!

php symfony symfony-3.1
2个回答
0
投票

默认加载

Resources/config/validation
中的验证文件。无需编辑加载方法。


0
投票

Symfomy 提供了一种内置方法,用于使用外部 yaml 文件映射自定义实体、模型的约束。这可以通过配置来完成:

# packages/validation.yaml
framework:
    validation:
        mapping:
            paths:
              - '.../user-model.yaml'
              - '.../cart-model.yaml'

您还可以在构建表单类型时即时加载 yaml 文件,以获得正确的关注点分离。 这是我在生产中使用的示例代码:

# Example validation.yaml file  
YourNamespace\YourModel:
properties:
    name:
        -   Symfony\Component\Validator\Constraints\NotBlank:
                message: 'Full name required'
        -   Symfony\Component\Validator\Constraints\Length:
                min: 7
    email:
        -   Symfony\Component\Validator\Constraints\NotBlank:
                message: 'E-mail required'


public function add(FormBuilderInterface $builder, string $yamlFilePath, string $class): void
{
    $validations = Yaml::parseFile($yamlFilePath));

    if (!is_array($validations) || !isset($validations[$class])) {
        return;
    }

    $constraints = [];
    $properties = $validations[$class]['properties'];
    foreach ($properties as $property => $propertyConstraints) {
        foreach ($propertyConstraints as $propertyConstraint) {
            $namespace = key($propertyConstraint);
            $constraints[$property][$namespace] = $propertyConstraint[$namespace];
        }
    }

    $constraintOptions = [];
    foreach ($constraints as $property => $propertyConstraint) {
        foreach ($propertyConstraint as $namespace => $options) {
            $constraintOptions[] = new $namespace($options);
        }
        $builder->add($property, null, ['constraints' => $constraintOptions]);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.