我建立有效载荷并将其提交到其他网站的路线
像这样[
...
'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中排除这条路线。
答案 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;
}
}