4

这可能是不可能的,如果是这种情况,那么我将不得不寻找另一种解决方案,所以如果无法完成,请告诉我。

我知道我可以获得 1=master 或 2=sub-request 的请求类型,但是有没有办法检测请求是否是 ESI 请求?

我的理解是,一个 ESI 永远是一个子请求,但是有很多不同的子请求。我需要我的响应侦听器来检测哪些肯定是 ESI 请求。

通常我的 ESI 请求将来自 Twig 中的 {{render_esi() }} 调用。

当然,我可以附加一个查询参数或其他东西,但如果可能的话,我宁愿能够在没有这个的情况下进行检测。

4

2 回答 2

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>
于 2015-07-21T15:54:36.457 回答
0

我的第一个想法是查看Fragment Listener,了解 Symfony2 如何检测 ESI 请求。

您还提到“通常我的 ESI 请求将来自 Twig 中的 {{render_esi() }} 调用。” 用你自己的函数包装 render_esi 函数,它会触发你可以监听的事件。这实际上就是 Fragment Listener 所做的。

希望那些对你有帮助。我相信还有很多其他方法可以做到这一点。

于 2013-12-30T23:47:30.773 回答