禁用Magento 2中特定控制器的Fullpage缓存

时间:2017-01-13 18:56:56

标签: php magento magento2

我建立有效载荷并将其提交到其他网站的路线

像这样

[
  ...
  'hash' => 'MD5_HASH_FOR_THIS_PAYLOAD' 

]

但问题是当我访问此路线时,magento第二次缓存数据时magento发送请求旧有效负载,

我在控制器的execute方法

中尝试了以下代码
 <?php 
 $cacheManager = $objectManager->get('\Magento\Framework\App\Cache\Manager');
 $types = array('full_page');
 $cacheManager->flush($types);

但对我没用。

修改

我没有此页面的xml布局,只有一个由控制器创建的块

 $block = $this->_view->getLayout()->createBlock('Vendor\Module\Block\MyBlock');
 $block->setCacheable(false);

有人可以帮助我如何从FPC中排除这条路线。

3 个答案:

答案 0 :(得分:2)

我认为你的特定页面有模板和模板的布局。块?

Magento的页面缓存是使用块信息。如果页面只有可缓存的块,那么magento会认为该页面可以被缓存。

只需在布局中添加cacheable="false",即需要动态的页面块。空缓存和magento应该完成其余的工作。

所以布局中的块应该是:

<block class="..." name="my_custom_block" as="custom" template="..." cacheable="false"/>

如果您不使用布局而是动态创建块,那么您可以在_construct方法中简单地在块上设置cache_lifetime:

protected function _construct()
{
    parent::_construct();
    $this->addData(array('cache_lifetime' => null));
}

我认为动态地直接在控制器中创建块是一种很好的做法。

答案 1 :(得分:1)

除了操纵块的可缓存性之外,请记住在某些情况下,例如将主体附加到默认响应,控制器响应可能会自行缓存。这意味着无论您为块定义什么,都不会禁用缓存。要解决此问题,您可以为您要发回的响应定义Cache-Control Headers。请参阅http://devdocs.magento.com/guides/v2.2/extension-dev-guide/cache/page-caching/public-content.html#disable-caching

中的以下示例
public function execute()
{
    $page = $this->pageFactory->create();

    //We are using HTTP headers to control various page caches (varnish, fastly, built-in php cache)
    $page->setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0', true);

    return $page;
}

在Magento 2.2.2中,Cache-Control也可以设置为默认$this->getResponse()

答案 2 :(得分:0)

您需要添加每个搜索查询唯一的缓存键。

di.xml中的topmenu块创建一个插件:

<type name="Magento\Theme\Block\Html\Topmenu">
    <plugin name="topmenu_searchbar" type="Vendor\Package\Plugin\Block\Topmenu" />
</type>

然后使用getAfterCacheKeyInfo()方法:

<?php

namespace Vendor\Package\Plugin\Block;

class Topmenu
{
    /**
     * @var \Magento\Search\Helper\Data
     */
    private $searchHelper;

    public function __construct(
        \Magento\Search\Helper\Data $searchHelper
    ) {
        $this->searchHelper = $searchHelper;
    }

    /**
     * Since the search bar was moved into the topnav, we need to add a key for the search term
     * so it doesn't get cached.
     */
     public function afterGetCacheKeyInfo(\Magento\Theme\Block\Html\Topmenu $subject, $result)
     {
         $result[] = $subject->getUrl('*/*/*', ['_current' => true, 'q' => $this->searchHelper->getEscapedQueryText()]);
         return $result;
     }
}