1

Symfony2 と FOSRestBundle で構築された REST API があります。これはすべて正常に機能しますが、あるサービスでは、別のサービスのデータを別のバンドルに結合します。これは単純なように見えましたが、そうではありません。

新しいリクエストオブジェクトを作成し、パラメータを追加しています。そこから他のサービスへのリクエストを開始します。サービスはリクエストを正常に受け取りますが、 $this->get を使用しようとすると、古き良きものが得られますCall to a member function get() on a non-object in ...

私はサービスコンテナが欠けていることを知っています(ヒットを最初のバンドルと呼んだときに利用可能であるが、2番目のバンドルでは利用できない理由を完全には理解していません)。$this->getservices.yml で定義されたカスタム サービスをヒットするために使用できますか? (を使用してサービスコンテナを簡単に渡すことができますarguments: container: "@service_container"

FOSRestBundle はサービスとして呼び出さないため、このバンドルをサービスとして設定しても機能しません。

要するに、bundle1の内部でbundle2からデータを取得できるようにしたい

namespace MyVendor\Bundle1\Controller

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;  
use MyVendor\Bundle2\Controller\Bundle2ClassName;

class Bundle1 {

    //if i wanted to do this here it would work fine:
    // $this->get('my.service.defined.in.service.yml');

    $bundle2 = new Bundle2ClassName();
    $returned_data = $bundle2->myFunction();
}

次に、bundle2 の myFunction 内でまったく同じサービス関数を呼び出そうとすると、恐ろしい get エラーが発生します。FOSRest ルートを介して bundle2 を直接呼び出すと、明らかにその問題は発生しません。

namespace MyVendor\Bundle2\Controller

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;  

class Bundle2 {

    //this does not work
    $this->get('my.service.defined.in.service.yml');

    //do some stuff then return response
    return($response);

}     

私はすべてのサービス コンテナ ドキュメントを何度も読んだので、それらにリンクする場合は、この内容がどのように処理されるかを説明している正確なセクションを指摘していただければ幸いです。これは、数か月前に Symfony を使い始めて以来、完全には理解できなかった唯一の問題です。

PS十分なポイントを持っている人は、FOSRestBundleをタグとして追加できますか?

ありがとう!

4

1 に答える 1

2

まず、$this->forwardリクエストを別のコントローラーに転送するために使用する必要があります。

次に、2 番目のコントローラーでサービス コンテナーにアクセスできない理由は、おそらく手動で初期化しようとしているからです。コントローラーの依存関係)。

3番目に、物事がどのように機能するかの例として-サービスコンテナーに対する元のコントローラーの依存関係は、同じコンテナーによって処理され、ContainerAwareそのコントローラーの初期化で asetContainer()が呼び出されます。したがって、それを機能させるには (実行しないことを強くお勧めします)、次のようにする必要があります。

class Bundle1 {

    //if i wanted to do this here it would work fine:
    // $this->get('my.service.defined.in.service.yml');

    $bundle2 = new Bundle2ClassName();
    $bundle2->setContainer($this->container);
    $returned_data = $bundle2->myFunction(); 
}

$this->get() on a non-object...エラーが発生する理由は、コントローラーが実際には(で定義されている)$this->get()へのショートカットであるためです。$this->container->get()Symfony\Bundle\FrameworkBundle\Controller\Controller

于 2012-06-22T05:41:20.957 に答える