将应用程序注入控制器

时间:2013-07-25 19:30:03

标签: php controller silex

我有以下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对象与注册服务一起使用。什么是正确的方法?目前,我正在__construct($app)使用DemoController并传递$app。这看起来像

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

最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

这当然是一种方法。我想展示两种选择。

一种是使用类型提示直接将应用程序注入到action方法中:

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);
    }
}

此选项的优点是您实际上不需要将控制器注册为服务。

另一种可能性是注入特定服务而不是注入整个容器:

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,容器或任何特定服务名称。这使它更加孤立,可重复使用并且更容易单独测试。