Как получить объект Request внутри расширения Twig в Symfony?
Как получить доступ к объекту Request
внутри Расширение Twig?
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";
}
}
Ответы
Ответ 1
Зарегистрируйте свое расширение как услугу и передайте ему службу контейнера:
# services.yml
services:
sybio.twig_extension:
class: %sybio.twig_extension.class%
arguments:
- @service_container
tags:
- { name: twig.extension, priority: 255 }
Затем извлеките контейнер с помощью конструктора класса (twig extension) и затем выполните запрос:
<?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');
}
}
// ...
Обратите внимание, что проверка области действия полезна, потому что при запуске консольной команды нет запроса, она позволяет избежать предупреждений.
Чтобы это, вы можете использовать запрос!
Ответ 2
Как указано в комментариях, здесь предпочтительный способ ввода запроса в любую службу. Он работает с Symfony >= 2.4.
Включение запроса и помещение нашей службы в область запроса больше не рекомендуется. Мы должны вместо этого использовать стек запросов.
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";
}
}
приложение /Config/services.yml
app.twig_extension:
class: AppBundle\Twig\MyExtension
arguments:
- '@request_stack'
tags:
- { name: twig.extension }
Docs:
Ответ 3
Я бы предложил установить 'needs_environment' => true
для вашего Twig_SimpleFunction
, который затем добавит \Twig_Environment
в качестве первого аргумента вашей функции. Затем в вашей функции вы можете найти запрос следующим образом:
$request = $twig->getGlobals()['app']->getRequest();
Таким образом, вся функция будет выглядеть так:
...
public function getFunctions() {
return [
new \Twig_SimpleFunction('xyz', function(\Twig_Environment $env) {
$request = $twig->getGlobals()['app']->getRequest();
}, [
'needs_environment' => true,
]),
];
}
...