首页 文章

symfony 3,参数不能传递给服务(使用setArguments)

提问于
浏览
0

更新:

我在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'));

但在我生成的bundle中没有传入任何参数 .


m使用symfony(版本3.1.6)构建应用程序,被卡住..任何帮助表示赞赏 .

详情如下:

1.使用'symfony console tool'生成一个包(没有选择可重用)

2.创建如下的服务类 .

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

services.yml:

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

3.my扩展类:

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') 时,它总是给我一个错误:

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

我错过了一些设置吗?

更新 - - - - -:

我在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"
    }
  }

//...

1 回答

  • 0

    Definition::setArguments() 接受所有参数的数组 . 通过 $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']);
    

相关问题