2013-07-10 5 views
7

コントローラクラスで$ appと$ requestにアクセスする簡単な方法が必要です。ドキュメントはこれを行うと言います。シレックスがコントローラクラスにアプリケーションとリクエストを渡す

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

$ appと$ requestをすべてのメソッドに注入する必要はありません。デフォルトですべてのコントローラに$ appと$ requestを含める方法はありますか?おそらくコンストラクタを使用していますか?私は$ this-> appとして使用できるようにしたいと思います。

ありがとうございました。

答えて

3

ドキュメントのControllers as Servicesでは、コントローラクラス(この場合はリポジトリ)を介してコントローラクラスに依存関係を注入する方法を説明しています。

+0

私は、コントローラのサービスを使用してみましたが、私はリクエストを注入することはできません。 ($ app、$ request); }); $ app - > share(function(Request $ request))を使用してください。 – tdbui22

+7

'$ app [" request "]'を介してリクエストにアクセスします。 – Maerlyn

+10

小さなメモ:Silex 2.Xでは '$ app ['request']'が '$ app ['request_stack'] - > getCurrentRequest()'に変更されました。 – Davincho

0

それは可能です:($app->run();前に)あなたのアプリケーションに続いて

namespace MyProject; 

use Silex\ControllerResolver as BaseControllerResolver; 

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

に登録:

は、プロジェクトのどこかControllerResolver.phpを作成し、この内部を入れ

$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'); 
    } 
} 
関連する問題