Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to split validation yaml files in Symfony 2.5?

This code worked for Symfony 2.4.5 but it is not working for Symfony 2.5:

This is my HRAPI Extension class that was working in Symfony 2.4.5 but not in Symfony 2.5

<?php

namespace HardCoreMore\HRAPIBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

/**
 * This is the class that loads and manages your bundle configuration
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 */
class HRAPIExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');

        // load validation configuration
        $yamlMappingFiles = $container->getParameter('validator.mapping.loader.yaml_files_loader.mapping_files');
        $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/site_user.yml';
        $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/human_resource.yml';
        $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/tag.yml';
        $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/company.yml';
        $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/programming_language.yml';
        $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/technology.yml';
        $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/language.yml';
        $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/management.yml';
        $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/calendar_entry.yml';
        $container->setParameter('validator.mapping.loader.yaml_files_loader.mapping_files', $yamlMappingFiles);
    }
}

It displays error:

ParameterNotFoundException: You have requested a non-existent parameter "validator.mapping.loader.yaml_files_loader.mapping_files".

Any ideas how to do it for Symfony 2.5?

like image 753
Caslav Sabani Avatar asked Jun 05 '14 15:06

Caslav Sabani


2 Answers

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());
    }

    // . . . .      
}
like image 185
Kevin Bond Avatar answered Sep 20 '22 15:09

Kevin Bond


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'
    )
));
like image 28
Wouter J Avatar answered Sep 18 '22 15:09

Wouter J