【问题标题】:Symfony bundle config service argumentsSymfony 捆绑配置服务参数
【发布时间】:2019-11-18 07:49:51
【问题描述】:

所以,我在 Symfony 中创建了新的 Bundle,现在,我想要为该 bundle 配置一个配置。它看起来像这样:

App\DireSolutions\TestUI\Resources\config\services.yaml

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  dire_solutions.ui_test.simple_service:
    public: true
    class: App\DireSolutions\TestUI\Service\SimpleService
    arguments:
      $client_id: '123'
      $client_secret: 'secret'

App\DireSolutions\TestUI\DependencyInjection\DireSolutionsTestUIConfiguration.php

class DireSolutionsTestUIConfiguration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('dire_solutions_test_ui');

        $rootNode
            ->children()
            ->arrayNode('twitter')
            ->children()
            ->integerNode('client_id')->end()
            ->scalarNode('client_secret')->end()
            ->end()
            ->end()// twitter
            ->end();

        return $treeBuilder;
    }
}

App\DireSolutions\TestUI\DependencyInjection\DireSolutionsTestUIExtension.php

class DireSolutionsTestUIExtension extends Extension
{
    /**
     * @param array $configs
     * @param ContainerBuilder $container
     * @throws \Exception
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader(
            $container,
            new FileLocator(__DIR__ . '/../Resources/config')
        );
        $loader->load('services.yaml');

        $configuration = new DireSolutionsTestUIConfiguration();

        $config = $this->processConfiguration($configuration, $configs);

        /** @var Definition $definition */
        $definition = $container->getDefinition('dire_solutions.ui_test.simple_service');

        $definition->setArgument('$client_id', $config['twitter']['client_id']);
        $definition->setArgument('$client_secret', $config['twitter']['client_secret']);
    }

}

App\DireSolutions\TestUI\Service\SimpleService.php

class SimpleService
{

    /**
     * SimpleService constructor.
     * @param ParameterBagInterface $params
     * @param string $client_id
     * @param string $client_secret
     */
    public function __construct($client_id, $client_secret)
    {
        dump($client_id);
        dump($client_secret);
        exit;
    }
}

通过这个配置我得到Cannot autowire service "App\DireSolutions\TestUI\Service\SimpleService": argument "$client_id" of method "__construct()" has no type-hint, you should configure its value explicitly.

无论我更改什么,我都无法手动将这些参数连接到服务中。

【问题讨论】:

  • 你的bundle在src目录下吗?如果是这样,那么您的主应用程序正在尝试自动装配它。您将需要排除它或将源移动到其他地方。此外,真正的包将在某处具有前缀 Bundle,即 MyBundle\Service\SomeService。 App 作为捆绑名称没有意义。怀疑你的扩展是否被调用了。
  • @Cerad 是的,它是一个 Bundle,它有自己的 services.yaml,当我更改某些内容时,它会被调用,但是当我尝试手动连接参数时它会一遍又一遍地失败那是字符串。
  • 似乎不太可能。您在 config/bundles.php 中的条目是什么样的?捆绑包源代码在哪里?当建议使用手动连接时,您为什么要尝试自动连接捆绑的服务?

标签: php symfony


【解决方案1】:

将您的 services.yaml 更改为

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  App\DireSolutions\TestUI\Service\SimpleService:
    arguments:
      $client_id: "123"
      $client_secret: "secret"

如果这不起作用,您可以尝试使用显式绑定参数

services:
      _defaults:
        autowire: true
        autoconfigure: true
        public: false
        bind: 
          $client_id: "123"
          $client_secret: "secret"

bind 甚至允许使用 php 内置类型,如 int、string 等。

最后一个选项是使用别名显式定义服务,这在某些情况下可能会有所帮助。

也改变你的

$definition = $container>getDefinition('dire_solutions.ui_test.simple_service');

$definition = $container>getDefinition('App\DireSolutions\TestUI\Service\SimpleService');

或创建一个别名,如上所述。

【讨论】:

  • 我发现了这个问题,即使我尝试只绑定参数而不动态创建它们(不使用扩展名)它也不起作用。所以我尝试了你的解决方案,但它不起作用。使用绑定和参数,它也会失败并出现同样的错误。有什么见解吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
相关资源
最近更新 更多