2013-07-25 57 views
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(); 
}); 

我希望有Application $app對象與註冊服務工作DemoController內。什麼是正確的方式?目前,我使用__construct($app)作爲DemoController並通過$app。這看起來像

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

這是什麼最佳做法?

回答

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

這個方案的好處是,你實際上並不需要將控制器註冊爲服務。

另一種可能是注入注入整個容器的特定服務,而不是:

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,容器或任何特定的服務名稱。這使得它更孤立,可重複使用,更容易獨立測試。

相關問題