2013-07-10 6 views
7

मैं $ एप तक पहुंचने और मेरे नियंत्रक वर्गों में $ अनुरोध का एक आसान तरीका चाहता हूं। दस्तावेज़सिलेक्स गुजरने वाला ऐप और नियंत्रक कक्षाओं के लिए अनुरोध

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

ऐसा करने के लिए कहते हैं, लेकिन यह हर विधि के लिए $ एप्लिकेशन और $ अनुरोध इंजेक्षन करने के लिए सही नहीं लगता है। डिफ़ॉल्ट रूप से $ एप और प्रत्येक नियंत्रक को $ अनुरोध शामिल करने का कोई तरीका है, शायद कन्स्ट्रक्टर का उपयोग कर? मैं इसे $-- ऐप के रूप में उपयोग करने में सक्षम होना चाहता हूं।

धन्यवाद।

उत्तर

3

Controllers as Services प्रलेखन का हिस्सा आप देख सकते हैं कि कन्स्ट्रक्टर के माध्यम से नियंत्रक वर्गों पर निर्भरता कैसे इंजेक्ट करें - उस स्थिति में एक भंडार। आप

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

अब:

+0

मैं नियंत्रक सेवा का उपयोग करने की कोशिश की, लेकिन मैं अनुरोध इंजेक्षन नहीं कर सकते। मैंने यह कोशिश की ... $ ऐप ['post.controller'] = $ app-> शेयर (फ़ंक्शन (अनुरोध $ अनुरोध) का उपयोग करें ($ ऐप) { नया पोस्ट कंट्रोलर ($ ऐप, $ अनुरोध) लौटाएं; }); – tdbui22

+7

'$ ऐप [" अनुरोध "]' के माध्यम से अनुरोध तक पहुंचें। – Maerlyn

+10

बस एक छोटा सा पक्ष नोट: सिलेक्स 2.X '$ ऐप ['अनुरोध'] में' 'ऐप में बदल गया ['request_stack'] -> getCurrentRequest()' – Davincho

0

यह संभव है:

एक ControllerResolver.php अपनी परियोजना में कहीं बनाएं और इस के अंदर डाल दिया: अपने एप्लिकेशन में ($app->run(); से पहले)

namespace MyProject; 

use Silex\ControllerResolver as BaseControllerResolver; 

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

तो यह रजिस्टर आपके ऐप के लिए बेस कंट्रोलर बना सकता है, उदाहरण के लिए:

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'); 
    } 
} 
संबंधित मुद्दे