2013-03-29 15 views
18

Come si può accedere all'oggetto Request all'interno di Twig Extension?Come ottenere oggetto Request all'interno di un'estensione Twig in Symfony?

namespace Acme\Bundle\Twig; 

use Twig_SimpleFunction; 

class MyClass extends \Twig_Extension 
{ 
    public function getFunctions() 
    { 
     return array(
      new Twig_SimpleFunction('xyz', function($param) { 

       /// here 
       $request = $this->getRequestObject(); 

      }) 
     ); 
    } 

    public function getName() { 

     return "xyz"; 

    } 

} 
+0

Dal momento che è ora 2014 o più tardi, veda la risposta Jakub Zalas' – Maurice

risposta

21

Registrati proprio interno come un servizio e dare il servizio container:

# services.yml 

services: 

    sybio.twig_extension: 
     class: %sybio.twig_extension.class% 
     arguments: 
      - @service_container 
     tags: 
      - { name: twig.extension, priority: 255 } 

quindi recuperare il contenitore dal tuo (estensione ramoscello) costruttore della classe e poi la richiesta:

<?php 
    // Your class file: 

    // ... 

    class MyClass extends \Twig_Extension 
    { 
     /** 
     * @var ContainerInterface 
     */ 
     protected $container; 

     /** 
     * @var Request 
     */ 
     protected $request; 

     /** 
     * Constructor 
     * 
     * @param ContainerInterface $container 
     */ 
     public function __construct($container) 
     { 
      $this->container = $container; 

      if ($this->container->isScopeActive('request')) { 
       $this->request = $this->container->get('request'); 
      } 
     } 

     // ... 

Si noti che testare l'ambito è utile perché non c'è richiesta durante l'esecuzione del comando della console, evita avvisi.

Ecco, è possibile utilizzare la richiesta!

+5

grezzo "container" per il servizio? cattiva idea – user1954544

+0

@ user1954544 hai ragione cattiva idea. Ma c'è una soluzione migliore? – d0001

+0

È ora possibile evitare di iniettare il contenitore. In Symfony 2.4 è possibile iniettare un servizio request_stack. –

35

Come richiesto nei commenti, ecco il modo preferito di iniettare una richiesta in qualsiasi servizio. Funziona con Symfony> = 2.4.

L'iniezione della richiesta e l'inserimento del servizio nell'ambito della richiesta non sono più raccomandati. Dovremmo usare invece the request stack.

namespace AppBundle\Twig; 

use Symfony\Component\HttpFoundation\RequestStack; 

class MyClass extends \Twig_Extension 
{ 
    private $requestStack; 

    public function __construct(RequestStack $requestStack) 
    { 
     $this->requestStack = $requestStack; 
    } 

    public function getFunctions() 
    { 
     $requestStack = $this->requestStack; 

     return array(
      new \Twig_SimpleFunction('xyz', function($param) use ($requestStack) { 
      $request = $requestStack->getCurrentRequest(); 
      }) 
     ); 
    } 

    public function getName() 
    { 
     return "xyz"; 
    } 
} 

app/config/services.yml

app.twig_extension: 
    class: AppBundle\Twig\MyExtension 
    arguments: 
     - '@request_stack' 
    tags: 
     - { name: twig.extension } 

Documenti:

+1

Questa è la risposta corretta a partire dal 2014 :) – jakabadambalazs

2

Ti suggerisco di impostare 'needs_environment' => true per il tuo Twig_SimpleFunction, che quindi aggiungerà \Twig_Environment come primo argomento della tua funzione. Poi nella funzione è possibile trovare la domanda in questo modo:

$request = $twig->getGlobals()['app']->getRequest();

Così l'intera funzione sarà simile a questa:

... 
public function getFunctions() { 
    return [ 
     new \Twig_SimpleFunction('xyz', function(\Twig_Environment $env) { 
      $request = $twig->getGlobals()['app']->getRequest(); 
     }, [ 
      'needs_environment' => true, 
     ]), 
    ]; 
} 
... 
Problemi correlati