我正在使用 Symfony3(与 SonataAdminBundle 一起),并且我需要创建一些验证文件。由于我有多个实体,并且我想将验证 yml 文件拆分为每个实体一个,因此我想使用依赖项注入加载器来加载这些文件。现在,我的问题是:
如果我为验证文件创建自定义加载器,我是否还需要手动加载 services.yml 和routing.yml?
我的代码是否存在任何明显的问题会导致以下错误?
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');
}
我可以用一些想法来解释为什么它找不到东西!
提前致谢!
默认加载
Resources/config/validation
中的验证文件。无需编辑加载方法。
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]);
}
}