如何在Symfony2中调试ParameterNotFoundException

时间:2014-04-25 13:02:54

标签: symfony yaml

在关注并调整this

后,我收到以下错误消息

ParameterNotFoundException:您已请求不存在的参数“mynamespace_admin.amazon_s3.aws_key”。你的意思是:“mynamespace_admin.amazon_s3.class”?

在config.yml中我有:

mynamespace_admin:
     amazon_s3:
         aws_key:        %amazon_aws_key%
         aws_secret_key: %amazon_aws_secret_key%
         base_url:       %amazon_s3_base_url%

在我的parameters.yml中,我有:

amazon_aws_key:         ###
amazon_aws_secret_key:  ###
amazon_s3_base_url:     ###
amazon_s3_bucket_name:  ###

在services.yml:

parameters:
     mynamespace_admin.amazon_s3.class: AmazonS3
     mynamespace_admin.image_uploader.class: mynamespace\Bundle\AdminBundle\Uploader\ImageUploader

    mynamespace_admin:
          amazon_s3:
            class: %mynamespace_admin.amazon_s3.class%
            arguments:
              - "%mynamespace_admin.amazon_s3.aws_key%"
              - "%mynamespace_admin.amazon_s3.aws_secret_key%"

          image_uploader:
            class: mynamespace_admin.image_uploader.class%
            arguments: [image_storage_filesystem]

任何人都可以看到我的配置错误或建议如何调试吗?为什么不能从config.yml读取mynamespace_admin.amazon_s3.aws_key?

1 个答案:

答案 0 :(得分:1)

如果服务配置中的parameters键下没有列出内容,则不会认为它是参数。

在所有其他情况下(services键除外),假设它是扩展的配置。在这种情况下,扩展名为mynamespace_admin。该扩展应该解析设置并可能将它们作为参数放在容器中,或者使用它们来决定要包含哪些文件等。

假设您给出的配置有一个正确的Configuration类,如果您想将配置用作参数,您的扩展名将如下所示:

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

class MynamespaceAdminExtension extends Extension
{
    /**
    * {@inheritDoc}
    */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        // ... do some other stuff, like loading service definition files

        // loop through the processed config and save them as parameters
        foreach ($config['amazon_s3'] as $name => $value) {
            $container->setParameter('mynamespace_admin.amazon_s3.'.$name, $value);
        }
    }
}