2013-03-29 2 views
18

Wie kann man auf das Request Objekt innerhalb Twig Extension zugreifen?Wie bekomme ich Request-Objekt in einer Twig-Erweiterung 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

Da es jetzt 2014 ist oder später Siehe Jakub Zalas' Antwort – Maurice

Antwort

21

Registrieren Erweiterung als Dienst und geben ihm den Container Service:

# services.yml 

services: 

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

Dann rufen Sie den Behälter durch Ihre (Zweig Erweiterung) Klassenkonstruktors und dann die Anfrage:

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

     // ... 

Beachten Sie, dass das Testen des Bereichs nützlich ist, da beim Ausführen des Konsolenbefehls keine Anforderung vorliegt. Warnungen werden vermieden.

Das ist es, Sie können die Anfrage verwenden!

+5

roh "Container" zu bedienen? schlechte Idee – user1954544

+0

@ user1954544 Sie sind richtig schlechte Idee. Aber gibt es eine bessere Lösung? – d0001

+0

Es ist jetzt möglich, das Injizieren des Behälters zu vermeiden. In Symfony 2.4 kann stattdessen ein request_stack-Dienst eingefügt werden. –

35

Wie in den Kommentaren gefordert, hier ist die bevorzugte Möglichkeit, eine Anfrage in einen Dienst zu injizieren. Es funktioniert mit Symfony> = 2.4.

Es wird nicht mehr empfohlen, die Anforderung einzufügen und unseren Service in den Anforderungsbereich zu stellen. Wir sollten stattdessen the request stack verwenden.

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 } 

Dokumente:

+1

Das ist die richtige Antwort ab 2014 :) – jakabadambalazs

2

Ich würde vorschlagen, 'needs_environment' => true für Ihre Twig_SimpleFunction, die dann \Twig_Environment als erstes Argument Ihrer Funktion hinzufügen wird. Dann in Ihrer Funktion können Sie die Anfrage wie folgt finden:

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

So ist die ganze Funktion wird wie folgt aussehen:

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