我有以下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);
} );
最佳做法是什么?
答案 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,容器或任何特定服务名称。这使它更加孤立,可重复使用并且更容易单独测试。