2013-07-10 15 views
7

Denetleyici sınıflarımdaki $ app ve $ request'e erişmek için basit bir yol istiyorum. Belge,Silex uygulaması geçiyor ve denetleyici sınıfları için istek

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

bunu söylüyor ama her yönteme $ uygulamasını ve $ isteği enjekte etmek zorunda hakkı görünmüyor. Varsayılan olarak her denetleyiciye $ app ve $ request eklemenin bir yolu var mı, belki kurucu kullanıyor mu? Bunu $ this-> app olarak kullanmak istiyorum.

Teşekkürler.

cevap

3

Controllers as Services belgesinin bir bölümünde, kurucu aracılığıyla denetleyici sınıflarına bağımlılıkların nasıl enjekte edileceğini görebilirsiniz - bu durumda bir depo.

+0

Ben kontrolör servisini kullanarak çalıştı ama ben İsteği enjekte edilemez. Bunu denedim ... $ app ['posts.controller'] = $ app-> paylaşım (fonksiyon (İstek isteğinde bulun) kullanım ($ app) { yeni PostController ($ app, $ request); }); – tdbui22

+7

İsteğe $ $ app ['request "]' ile erişebilirsiniz. – Maerlyn

+10

Sadece küçük bir not: Silex'de 2.X '$ app ['request']' '$ app ['request_stack'] -> getCurrentRequest()' olarak değiştirildi – Davincho

0

Mümkün: ($app->run(); öncesi) uygulamanızda Sonra

namespace MyProject; 

use Silex\ControllerResolver as BaseControllerResolver; 

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

kaydetmek:

projenizde bir yere ControllerResolver.php oluşturun ve icine sunu

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

Şimdi uygulamanız için bir temel denetleyici oluşturabilir, örneğin:

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

} 

Ve ister uzatmak:

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

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