我有一个依赖于一个相当片状第三方服务来获取数据来呈现这样,当它遇到问题的块,我想显示一个错误信息,而不是抛出一个异常,而不是渲染页面。
足够容易做,直到你来块/页的高速缓存。 该数据具有长寿命所以,当发现它的罚款缓存的一切。 如果不是的话,虽然,页面缓存与地方的错误消息。 因此,我需要告诉CMS不保存块或页面输出缓存。
示例代码(块控制器内):
public function view() {
try {
$this->set ('data', $this->getData());
} catch (\Exception $e) {
\Log::addError ('Blockname Error: '.$e->getMessage(), [$e]);
$this->render ('error');
}
}
在catch块我都试过$this->btCacheBlockOutput = true;
和\Cache::disableAll();
但既不工程。 有没有办法告诉C5不要对当前的请求缓存什么?
在具体的文件夹中的BlockController拥有这些受保护的变量设置为标准:
protected $btCacheBlockRecord = true;
protected $btCacheBlockOutput = false;
protected $btCacheBlockOutputOnPost = false;
protected $btCacheBlockOutputForRegisteredUsers = false;
所以,如果你将所有这些在你的块Controller.php这样虚假的,它不应该缓存你的块。
class Controller extends BlockController
{
protected $btCacheBlockRecord = false;
protected $btCacheBlockOutput = false;
protected $btCacheBlockOutputOnPost = false;
protected $btCacheBlockOutputForRegisteredUsers = false;
public function view(){
.....
这将禁用块(即使第三方连接成功)的缓存。
不同的解决方案是,如果第三方连接无法从第三方接收到的数据从数据库保存在数据库中(例如作为JSON字符串),并加载数据......如果第三方连接成功,你可以更新在数据库中的记录。
根据第三方服务的回答,您可以设置的条件。 例:
//service returns on OK:
//array('status' => 'ok')
//service returns on NOT OK:
//array('status' => 'nok')
public function view() {
$data = $this->getData();
if($data['status'] == 'ok'){
//save data to database in a config value using concrete Config class
$configDatabase = \Core::make('config/database');
$configDatabase->save('thirdpartyanswer', $data);
$this->set('data', $data);
}else{
//getData function returned error or nok status
//get data from concrete Config class
$configDatabase = \Core::make('config/database');
if($configDatabase->get('thirdpartyanswer')) != ''){
//set data as "old" data from config
$this->set('data', $configDatabase->get('thirdpartyanswer'));
}else{
//no data in config -> set error and nothing else
$this->set('error', 'An error occured contacting the third party');
}
}
}
(上面的代码还没有被测试)
上存储的配置值的详细信息:
https://documentation.concrete5.org/developers/packages/storing-configuration-values
*编辑*
第三个选项是清除高速缓存中的特定页面,如果调用失败。
在你blockcontroller的顶部:
use \Concrete\Core\Cache\Page\PageCache;
use Page;
在“如果”时调用API失败:
$currentPage = Page::getCurrentPage();
$cache = PageCache::getLibrary();
$cache->purge($currentPage);
:在发现https://www.concrete5.org/community/forums/5-7-discussion/programmatically-expiring-pages-from-cache