将参数加载到Symfony捆绑包中时出错

问题描述

我收到以下错误

没有扩展程序能够加载以下配置 “ upload_images”(在 “ /var/www/vhosts/diabetigraph-dev/vendor/verzeilberg/upload-images/src/Resources/services.yaml”)。 寻找名称空间“ upload_images”,发现“无”

这是我的文件

services.yaml

services:
  verzeilberg\UploadImagesBundle\Service\Rotate:
    autowire: true

upload_images:
  version: 100

配置

namespace verzeilberg\UploadImagesBundle\DependencyInjection;

use Symfony\Component\Config\DeFinition\Builder\TreeBuilder;
use Symfony\Component\Config\DeFinition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder('upload_images');
        $treeBuilder->getRootNode()
                ->children()
                    ->integerNode('version')->end()
                ->end();
        return $treeBuilder;
    }
}

UploadImagesExtension

namespace verzeilberg\UploadImagesBundle\DependencyInjection;

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

class UploadImagesExtension extends Extension
{
    public function load(array $configs,ContainerBuilder $container)
    {
        $loader = new YamlFileLoader($container,new FileLocator(dirname(__DIR__).'/Resources'));
        $loader->load('services.yaml');
        $config = $this->processConfiguration(new Configuration(),$configs);
        $container->setParameter('version',$config['version']);
    }
}

我在做什么错了?

解决方法

基本答案是需要将您的upload_images配置移至其自己的应用程序级config / packages文件:

# app/config/packages/upload_images.yaml
upload_images:
  version: 100

在捆绑软件中,配置对象代表捆绑软件的配置。捆绑包中没有类似upload_images.yaml的文件。该对象功能非常强大,因此您可以添加默认值和选项,而不添加其他内容。

您包的扩展名负责处理最终配置,并使诸如参数之类的信息可用于系统的其余部分:

class UploadImagesExtension extends Extension
{
    public function load(array $configs,ContainerBuilder $container)
    {
        // $configs is actually an array of array representing the contents of upload_files.yaml
        $config = $this->processConfiguration(new Configuration(),$configs);
        $container->setParameter('upload_files.version',$config['version']);

        // Loading your bundle's services.yaml file is a different process which just happens to be kicked off by the loader
        // Thanks to the setParameter above,%upload_files.version% can be used by services
        $loader = new YamlFileLoader($container,new FileLocator(dirname(__DIR__).'/Resources'));
        $loader->load('services.yaml');
    }
}

这可能会造成混乱,至少对我来说,我不得不多次阅读文档,并做了很多实验以了解整个过程。

混乱是Symfony从每个应用程序的多个捆绑包演变为一个应用程序捆绑包甚至根本没有应用程序捆绑包的原因之一。

我可能还会添加Symfony使用作曲家的食谱来简化捆绑包的安装。配方不仅将捆绑软件添加到config / bundles.php,还将所有默认配置文件也复制到config / packages。不幸的是,要完成此复制,还需要执行其他步骤(请参阅文档),因此最简单的方法是采用老式的方法,只是告诉开发人员通过捆绑软件的README文件创建配置文件。