首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >symfony 3,参数不能传递给服务(使用setArguments)

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

Stack Overflow用户
提问于 2016-12-26 06:59:26
回答 1查看 376关注 0票数 0

更新:

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

代码语言:javascript
复制
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.创建一个服务类,如下所示。

代码语言:javascript
复制
class RolesProvider(){
        public function __construct(array $roles){
            //...
        }
}

services.yml:

代码语言:javascript
复制
services:
    user.roles.provider:
        class: UserBundle\Role\RolesProvider

3.我的补习班:

代码语言:javascript
复制
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.我的配置类

代码语言:javascript
复制
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:

代码语言:javascript
复制
user:
    roles: ["ROLE_SUPER", "ROLE_ADMIN", "ROLE_USER"]

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

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

我错过了一些设定吗?

更新

我将$config和$rolesProviderDef变量转储到扩展类中,并得到以下内容

$config

代码语言:javascript
复制
array(1) {
 ["roles"]=>
 array(3) {
   [0]=>
   string(10) "ROLE_SUPER"
   [1]=>
   string(10) "ROLE_ADMIN"
   [2]=>
   string(9) "ROLE_USER"
 }
}

$rolesProviderDef的一些代码:

代码语言:javascript
复制
//...
["arguments":protected]=>
  array(1) {
    [0]=>
    array(3) {
      [0]=>
      string(10) "ROLE_SUPER"
      [1]=>
      string(10) "ROLE_ADMIN"
      [2]=>
      string(9) "ROLE_USER"
    }
  }

//...
EN

回答 1

Stack Overflow用户

发布于 2016-12-26 07:58:19

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

代码语言:javascript
复制
// somewhere in the compiled container:
new RolesProvider("ROLE_SUPER", "ROLE_ADMIN", "ROLE_USER");

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

代码语言:javascript
复制
// note the additional brackets
$rolesProviderDef->setArguments([$config['roles']]); 

// or

// set only first one argument
$rolesProviderDef->replaceArgument(0, $config['roles']); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41327569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档