这可能是不可能的,如果是这种情况,那么我将不得不寻找另一种解决方案,所以如果无法完成,请告诉我。
我知道我可以获得1 = master或2 = sub-request的Request Type,但有没有办法检测请求是否是ESI请求?
我的理解是ESI总是一个子请求,但有许多不同的子请求。我需要我的Response Listener来检测哪些是ESI请求。
通常我的ESI请求来自Twig中的{{render_esi()}}调用。
当然我可以附加一个查询参数或者其他东西,但如果可能的话,我宁愿能够在没有它的情况下进行检测。
答案 0 :(得分:2)
我意识到这个问题已经过时了,你可能已经找到了一个解决方案,但是,最近我遇到了同样的问题,并且解决这个问题的方法是用我自己的问题替换FragmentListener
类。在Request
对象上设置属性。感谢@Johnny提供FragmentListener
提示。
如下所示:
php类:
<?php
namespace Your\Namespace\Here;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\EventListener\FragmentListener as SymfonyFragmentListener;
class FragmentListener extends SymfonyFragmentListener
{
private $signer;
private $fragmentPath;
/**
* {@inheritdoc}
*/
public function __construct(UriSigner $signer, $fragmentPath = '/_fragment')
{
parent::__construct($signer, $fragmentPath);
$this->signer = $signer;
$this->fragmentPath = $fragmentPath;
}
/**
* {@inheritdoc}
*/
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (
$request->attributes->has('_controller')
|| $this->fragmentPath !== rawurldecode($request->getPathInfo())
) {
return;
}
$event->getRequest()->attributes->set('esi', true);
parent::onKernelRequest($event);
}
}
服务定义:
<?xml version="1.0" ?>
<container
xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<parameters>
<parameter key="fragment.listener.class">Your\Namespace\Here\FragmentListener</parameter>
</parameters>
</container>
答案 1 :(得分:0)
我的第一个想法是查看Fragment Listener,了解Symfony2如何检测ESI请求。
您还提到“通常我的ESI请求将来自Twig中的{{render_esi()}}调用。”如何用你自己的方法包装render_esi函数来触发你可以监听的事件。这实际上就是Fragment Listener所做的事情。
希望有所帮助。我确信还有很多其他方法可以做到这一点。