【问题标题】:symfony 3, arguments cant be passed to services(setArguments used)symfony 3,参数不能传递给服务(setArguments used)
【发布时间】:2016-12-26 06:59:26
【问题描述】:

更新:

我在 AppBundle(自动生成的)中做了同样的事情,一切正常,并且在编译版本(var/cache/dev/appDevDebugProjectContainer.php)中,参数传递如下

return $this->services['app.roles'] = new \AppBundle\Role\RolesProvider(array(0 => 'ROLE_SUPER', 1 => 'ROLE_ADMIN', 2 => 'ROLE_USER'));

但在我生成的包中没有传入任何参数。


我正在使用 symfony(版本 3.1.6)构建一个应用程序,卡住了.. 任何帮助表示赞赏。

详情如下:

1. 使用“symfony 控制台工具”生成捆绑包(未选择可重用)

2.创建如下服务类。

class RolesProvider(){
        public function __construct(array $roles){
            //...
        }
}

services.yml:

services:
    user.roles.provider:
        class: UserBundle\Role\RolesProvider

3.我的扩展类:

class UserExtension extends Extension {
    public function load(array $configs, ContainerBuilder $container) {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
        $loader->load('services.yml');

        $rolesProviderDef = $container->getDefinition('user.roles.provider');

        $rolesProviderDef->setArguments([
            $config['roles']
        ]);
    }
}

4.my 配置类

class Configuration implements ConfigurationInterface{
    public function getConfigTreeBuilder() {
        $treeBuilder = new TreeBuilder;
        $rootNode = $treeBuilder->root('user');
        $rootNode->children()
                ->arrayNode('roles')
                    ->prototype('scalar')->end()
                ->end();

        return $treeBuilder;
    }
}

5.config.yml:

user:
    roles: ["ROLE_SUPER", "ROLE_ADMIN", "ROLE_USER"]

当我打电话给$this->get('user.roles.provider')时,它总是给我一个错误:

类型错误:参数 1 传递给 UserBundle\Role\RolesProvider::__construct() 必须是类型 数组,没有给定,

我是否错过了一些设置?

更新---------:

我在 Extension 类中转储了 $config 和 $rolesProviderDef 变量并得到了这个

$配置

array(1) {
 ["roles"]=>
 array(3) {
   [0]=>
   string(10) "ROLE_SUPER"
   [1]=>
   string(10) "ROLE_ADMIN"
   [2]=>
   string(9) "ROLE_USER"
 }
}

$rolesProviderDef 的一些代码:

//...
["arguments":protected]=>
  array(1) {
    [0]=>
    array(3) {
      [0]=>
      string(10) "ROLE_SUPER"
      [1]=>
      string(10) "ROLE_ADMIN"
      [2]=>
      string(9) "ROLE_USER"
    }
  }

//...

【问题讨论】:

  • 你检查$config['roles']真的数组了吗?
  • 嗨@MertÖksüz,我已经转储了一些变量,并更新了我的帖子。谢谢
  • 我刚刚复制了您的代码,一切正常。我假设您正在开发模式下工作?也许尝试清除缓存。您的配置转储具有三个角色,但 config.yml 只有两个? 'symfony 控制台工具'是否意味着 bin/console generate:bundle?由于您的 var_dumps 正在工作,那么您的各种类名可能是正确的。

标签: php symfony service containers


【解决方案1】:

Definition::setArguments() 接受 all 参数的数组。传递$config['roles'] 会产生这样的想法:

// somewhere in the compiled container:
new RolesProvider("ROLE_SUPER", "ROLE_ADMIN", "ROLE_USER");

我不确定这是不是问题,因为它应该会导致其他类型错误。但可能会导致错误的代码生成(?) 试试这个:

// note the additional brackets
$rolesProviderDef->setArguments([$config['roles']]); 

// or

// set only first one argument
$rolesProviderDef->replaceArgument(0, $config['roles']); 

【讨论】:

  • 但是["arguments":protected]=>... 的转储只包含一级数组,好像缺少括号(?)
  • 嗯.....现在应该是正确的,消息说“类型错误:没有给出参数”,并且堆栈跟踪显示了一些代码(在 var/cache/dev/appDevDebugProjectContainer. php) 喜欢return $this->services['user.roles.provider'] = new \UserBundle\Role\RolesProvider();。它应该在这里吗?我添加了另一个参数,新的参数效果很好,但 $roles 参数仍然没有
  • 是的,你的 arg 应该在 appDevDebugProjectContainer.php 中。它是所有配置内容的编译版本。我在您发布的代码中看不到错误。
猜你喜欢
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
相关资源
最近更新 更多