此代码适用于Symfony 2.4.5,但它不适用于Symfony 2.5:
这是我在Symfony 2.4.5中工作的HRAPI扩展类,但在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);
}
}
显示错误:
ParameterNotFoundException:您已请求不存在的参数“validator.mapping.loader.yaml_files_loader.mapping_files”。
如何为Symfony 2.5做任何想法?
答案 0 :(得分:20)
Symfony 2.5改变了验证文件的加载方式。以下是如何执行此操作(使用Finder组件动态加载):
创建编译器传递:
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'));
}
}
然后,在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());
}
// . . . .
}
答案 1 :(得分:2)
您应该使用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'
)
));
答案 2 :(得分:2)
这与Symfony 2.7开箱即用。