2016-12-26 9 views
0

更新:symfonyの3、引数は(使用setArguments)サービスに渡すことがカント

私は、(自動1を生成)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バンドル以下のような2.createサービスクラス(いずれも再利用可能な選択されていない)

「をsymfonyのコンソール・ツール」を使用して、次のよう

詳細。

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のConfigurationクラス

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

いくつかのコードを持っ

は---------を更新しました

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

//... 
+1

あなたは '$の設定[「役割」]'本当に配列をチェックしましたか? –

+0

こんにちは@MertÖksüz、私はいくつかの変数をダンプし、私のポストを更新します。ありがとう –

+0

私はちょうどあなたのコードを複製し、物事は期待どおりに動作します。あなたは開発モードで作業していると思いますか?おそらく、キャッシュをクリアしてみてください。設定ダンプには3つの役割がありますが、config.ymlには2つの役割しかありませんか? 'symfonyコンソールツール'はbin/console generate:bundleを意味しますか?あなたのvar_dumpsが動作しているので、さまざまなクラス名が正しいでしょう。 – Cerad

答えて

0

は、アレイ0を受け入れ:$ rolesProviderDefの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

'[" arguments ":protected] => ...のダンプは、かっこが欠けているかのように1レベルの配列しか含まれていません(?) – Timurib

+0

um .....今は正しいはずです。エラー:何も引数が与えられていません '、スタックトレースは 'return $ this-> services [' user.roles.provider '] = new \ UserBundle \ Roleのようなコードをvar/cache/dev/appDevDebugProjectContainer.phpに表示します\ RolesProvider(); 'それはここにあるべきですか?私は別の引数を追加し、新しい引数を追加してもうまくいくが、$ rolesパラメータでは何も得られない。 –

+0

はい、あなたの引数はappDevDebugProjectContainer.phpにあるはずです。それはすべての設定のもののコンパイルされたバージョンです。投稿されたコードにエラーが表示されません。 – Cerad

関連する問題