0

私は次の DemoController を持っています

class DemoController {

    public function test() {
        return new Response('This is a test!');
    }

}

このコントローラーをバインドしたい$app ['demo.controller']

$app ['demo.controller'] = $app->share ( function () use($app) {
    return new DemoController ();
} );

DemoController 内で、Application $appオブジェクトを登録済みサービスと連携させたいと考えています。正しい方法は何ですか?現在、私はand passに使用__construct($app)しています。これは次のように見えますDemoController$app

$app ['demo.controller'] = $app->share ( function () use($app) {
    return new DemoController ($app);
} );

そのためのベストプラクティスは何ですか?

4

1 に答える 1

1

それは確かにそれを行う1つの方法です。2 つの選択肢を示したいと思います。

1 つは、タイプ ヒントを使用してアプリケーションをアクション メソッドに直接注入する方法です。

use Silex\Application;
use Symfony\Component\HttpFoundation\Request;

class DemoController
{
    public function test(Request $request, Application $app)
    {
        $body = 'This is a test!';
        $body .= ':'.$request->getRequestUri();
        $body .= ':'.$app['foo']->bar();
        return new Response($body);
    }
}

このオプションの利点は、コントローラーをサービスとして実際に登録する必要がないことです。

もう 1 つの可能性は、コンテナー全体を注入する代わりに、特定のサービスを注入することです。

use Silex\Application;
use Symfony\Component\HttpFoundation\Request;

class DemoController
{
    private $foo;

    public function __construct(Foo $foo)
    {
        $this->foo = $foo;
    }

    public function test()
    {
        return new Response($this->foo->bar());
    }
}

サービス定義:

$app['demo.controller'] = $app->share(function ($app) {
    return new DemoController($app['foo']);
});

このオプションの利点は、コントローラーが silex、コンテナー、または特定のサービス名に依存しなくなることです。これにより、より分離され、再利用可能になり、分離してテストしやすくなります。

于 2013-08-18T21:18:26.440 に答える