2

セッション サービスを挿入するテスト クラス:

namespace Acme\DemoBundle\Controller;

use JMS\DiExtraBundle\Annotation as DI;

class TestDI
{

    /** @DI\Inject("session") */
    public $session;

}

テスト クラスの型を出力するコントローラー アクション:

... Controller {

/** @DI\Inject("session") */
private $session;

public function testAction()
{
    $test = new TestDI();
    echo gettype($this->session).'<br/>';
    echo gettype($test->session);
    return array();
}

私に与えます:

object
NULL

結果。@Inject が自分のクラスで機能しないのはなぜですか?

4

1 に答える 1

1

DIExtra アノテーションを機能させるには、コントローラー以外のクラスをサービスとして登録する必要があります。これを実現する最も簡単な方法は、クラスレベルの@Serviceアノテーション ( JMS\DiExtraBundle\Annotation\Service) を追加することです。

非コントローラ クラスが JMSDiExtraBundle によって実際に検出されたディレクトリにあることを確認する必要があります。バンドルの構成で検索されるバンドルとディレクトリを構成できます。

jms_di_extra:
    locations:
        all_bundles: false
        bundles: [FooBundle, AcmeBlogBundle]
        directories: ["%kernel.root_dir%/../src"]

さらに覚えておいてください:

プライベートまたは保護されたプロパティでは @Inject アノテーションを使用できないことに注意してください。

同様に、@InjectParams アノテーションは、保護されたメソッドまたはプライベート メソッドでは機能しません。

詳細については、公式ドキュメントの非コントローラー クラスの章を参照してください。

于 2013-08-30T13:24:29.157 に答える