2013-07-10 16 views
7

Desidero un modo semplice per accedere a $ app e $ richiesta nelle mie classi controller. Il documento dice di fare questo,Passaggio Silex app e richiesta alle classi controller

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

ma non sembra giusto dover iniettare $ app e $ richiesta per ogni metodo. C'è un modo per includere $ app e $ richiesta per ogni controller di default, magari usando il costruttore? Mi piacerebbe essere in grado di usarlo come $ this-> app.

Grazie.

risposta

3

Nella parte Controllers as Services della documentazione è possibile vedere come iniettare dipendenze alle classi controller tramite il costruttore - in tal caso un repository.

+0

Ho provato ad utilizzare il servizio di controllo, ma non può iniettare la richiesta. Ho provato questo ... $ app ['posts.controller'] = $ app-> share (funzione (Richiesta $ richiesta) uso ($ app) { restituisce nuovo PostController ($ app, $ richiesta); }); – tdbui22

+7

Accedere alla richiesta tramite '$ app [" richiesta "]'. – Maerlyn

+10

Solo una piccola nota a margine: In Silex 2.X '$ app ['richiesta']' cambiato in '$ app ['request_stack'] -> getCurrentRequest()' – Davincho

0

E 'possibile:

Creare un ControllerResolver.php qualche parte nel progetto e mettere questo all'interno:

namespace MyProject; 

use Silex\ControllerResolver as BaseControllerResolver; 

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

quindi registrarlo nella vostra applicazione (prima $app->run();):

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

Ora puoi creare un controller di base per la tua app, ad esempio:

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

} 

ed estenderlo:

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

     return $this->render('home.html.twig'); 
    } 
}