2016-12-26 30 views
0

更新:的symfony 3,參數不能被傳遞給服務(使用setArguments)

我做的的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.generate通過使用「symfony的控制檯工具」束(無重複使用的選擇的)

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'),它總是給我一個錯誤:

Type error: Argument 1 passed to UserBundle\Role\RolesProvider::__construct() must be of the type array, none given,

有我錯過了一些設置或這樣嗎?

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

我甩在擴展類的$配置和$ 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

hi @MertÖksüz,我傾倒了一些變量,並更新我的帖子。謝謝 –

+0

我剛剛複製了你的代碼,並且事情按預期工作。我假設你正在開發模式?也許嘗試清除緩存。您的配置轉儲有三個角色,但config.yml只有兩個? 'symfony控制檯工具'是否意味着bin/console生成:bundle?由於你的var_dumps在工作,所以你的各種類名可能是正確的。 – Cerad

回答

0

接受數組o f 全部論點。傳遞一個$config['roles']喜歡我產生somethink:

// 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']); 
+0

但'[「參數」:保護] => ...'只包含一級陣列,就像丟失了括號(?) – Timurib

+0

um .....現在它應該是正確的,消息說'類型錯誤:沒有給出任何參數「,堆棧跟蹤顯示了一些代碼(在var/cache/dev/appDevDebugProjectContainer.php中),比如'return $ this-> services ['user.roles.provider'] = new \ UserBundle \ Role \ RolesProvider();'。它應該在這裏嗎?我添加了另一個參數,新的參數運行良好,但仍然沒有獲得$角色參數 –

+0

是的,您的arg應該位於appDevDebugProjectContainer.php中。它是所有配置的編譯版本。我看不到您的發佈代碼中的錯誤。 – Cerad