2013-07-10 80 views
7

我想要一個簡單的方法來訪問我的控制器類中的$ app和$ request。該文件說這樣做,Silex將應用程序和請求傳遞給控制器​​類

public function action(Application $app, Request $request) { 
// Do something. 
} 

但它看起來不正確的必須注入$ app和$請求到每個方法。有沒有辦法在默認情況下將$ app和$ request包含到每個控制器,也許使用構造函數?我希望能夠以$ this-> app的形式使用它。

謝謝。

回答

3

Controllers as Services文檔的一部分中,您可以看到如何通過構造函數向控制器類注入依賴項 - 在這種情況下是存儲庫。

+0

我嘗試使用控制器服務,但我不能注入的請求。我試過這個... $ app ['posts.controller'] = $ app-> share(function(Request $ request)use($ app){ return new PostController($ app,$ request); }); – tdbui22

+7

通過'$ app [「request」]訪問請求。 – Maerlyn

+10

只是一個小方面的說明:在Silex 2.X'$ app ['request']'改爲'$ app ['request_stack'] - > getCurrentRequest()' – Davincho

0

這是可能的:

在你的項目中創建一個ControllerResolver.php的地方,並把這個裏面:

namespace MyProject; 

use Silex\ControllerResolver as BaseControllerResolver; 

class ControllerResolver extends BaseControllerResolver 
{ 
    protected function instantiateController($class) 
    { 
     return new $class($this->app); 
    } 
} 

然後將其註冊在您的應用程序($app->run();前):

$app['resolver'] = function ($app) { 
    return new \MyProject\ControllerResolver($app, $app['logger']); 
}; 

現在你可以爲您的應用程序創建一個基本控制器,例如:

namespace MyProject; 

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

abstract class BaseController 
{ 
    public $app; 

    public function __construct(Application $app) 
    { 
     $this->app = $app; 
    } 

    public function getParam($key) 
    { 
     $postParams = $this->app['request_stack']->getCurrentRequest()->request->all(); 
     $getParams = $this->app['request_stack']->getCurrentRequest()->query->all(); 

     if (isset($postParams[$key])) { 
      return $postParams[$key]; 
     } elseif (isset($getParams[$key])) { 
      return $getParams[$key]; 
     } else { 
      return null; 
     } 
    } 

    public function render($view, array $parameters = array()) 
    { 
     $response = new Response(); 
     return $response->setContent($this->app['twig']->render($view, $parameters)); 
    } 

} 

並且將其擴展:

class HomeController extends BaseController 
{ 
    public function indexAction() 
    { 
     // now you can use $this->app 

     return $this->render('home.html.twig'); 
    } 
} 
相關問題