How to split validation yaml files in Symfony 2.5?

心已入冬 提交于 2019-11-28 10:17:59
Kevin Bond

Symfony 2.5 changed the way validation files were loaded. Here is how to do it now (using the Finder component to dynamically load):

Create a compiler pass:

namespace MyBundle\DependencyInjection\Compiler;

use Symfony\Component\Finder\Finder;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\Config\Resource\DirectoryResource;

class ValidatorPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $validatorBuilder = $container->getDefinition('validator.builder');
        $validatorFiles = array();
        $finder = new Finder();

        foreach ($finder->files()->in(__DIR__ . '/../../Resources/config/validation') as $file) {
            $validatorFiles[] = $file->getRealPath();
        }

        $validatorBuilder->addMethodCall('addYamlMappings', array($validatorFiles));

        // add resources to the container to refresh cache after updating a file
        $container->addResource(new DirectoryResource(__DIR__ . '/../../Resources/config/validation'));
    }
}

Then, add this compiler pass in your Bundle:

namespace MyBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use MyBundle\DependencyInjection\Compiler\ValidatorPass;

class MyBundle extends Bundle
{
    // . . . .

    public function build(ContainerBuilder $container)
    {
        parent::build($container);

        $container->addCompilerPass(new ValidatorPass());
    }

    // . . . .      
}

You should use ValidatorBuilder#addYamlMappings/ValidatorBuilder#addYamlMapping:

$builderDefinition = $container->getDefinition('validator.builder');
$builderDefinition->addMethodCall('addYamlMappings', array(
    array(
        __DIR__.'/../Resources/config/validation/site_user.yml';
        __DIR__.'/../Resources/config/validation/human_resource.yml';
        __DIR__.'/../Resources/config/validation/tag.yml';
        __DIR__.'/../Resources/config/validation/company.yml';
        __DIR__.'/../Resources/config/validation/programming_language.yml';
        __DIR__.'/../Resources/config/validation/technology.yml';
        __DIR__.'/../Resources/config/validation/language.yml';
        __DIR__.'/../Resources/config/validation/management.yml';
        __DIR__.'/../Resources/config/validation/calendar_entry.yml'
    )
));

This works out-of-the box with Symfony 2.7.

https://github.com/symfony/symfony/pull/13855

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!