【发布时间】: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 中的条目是什么样的?捆绑包源代码在哪里?当建议使用手动连接时,您为什么要尝试自动连接捆绑的服务?