8

Symfony コントローラーでサービスにアクセスしようとしています

$session = $this->get('session');

しかし、次のエラーが発生します。

PHP Fatal error: Call to a member function get() on a non-object

Symfony2 には、デフォルトでコントローラーがサービスとして定義されていると思いました。

注: この質問はもともとDbuggerによって尋ねられましたが、既に回答されているにもかかわらず、理由もなく削除されました。

4

1 に答える 1

16

コントローラーでコンテナーを使用する

get()コンテナーにアクセスするためにSymfony の基本コントローラー クラスによって提供されるショートカット関数にすぎません。

この関数を使用するには、コントローラーがこのクラスを拡張する必要があります。

namespace Acme\ExampleBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    // your actions
}

(何らかの理由で) このクラスに依存したくない場合は、拡張 してコンテナーを挿入し、ショートカットContainerAwareのように使用できます。get()

namespace Acme\ExampleBundle\Controller;
use Symfony\Component\DependencyInjection\ContainerAware;

class DefaultController extends ContainerAware
{
    public function exampleAction()
    {
        $myService = $this->container->get('my_service');

        // do something
    }
}

自分でコントローラーを作成する

コントローラーはデフォルトではサービスとして定義されていません。定義できますが、コンテナーを取得する必要はありません。要求が行われると、ルーティング フレームワークは、呼び出す必要があるコントローラーを決定します。次に、コントローラーが構築され、コンテナーがsetContainer()メソッドを介して注入されます。

ただし、(テストまたはその他の場所で) 独自にコントローラーを作成する場合は、独自にコンテナーを挿入する必要があります。

$controller = new DefaultController();
$controller->setContainer($container);
// $container comes trough DI or anything else.
于 2013-09-25T11:17:01.660 に答える