Concrete5(5.7) - 不要在块错误上缓存页面或当前块

时间:2017-02-02 19:01:49

标签: php concrete5 concrete5-5.7 concrete

我有一个块依赖于一个相当片段的第三方服务来获取数据,因此,当它遇到问题时,我想显示一条错误消息,而不是抛出异常而不是渲染页面。

在您进行阻止/页面缓存之前,这很容易做到。数据的生命周期很长,所以一旦找到,就可以缓存所有内容。但是,如果不是,则缓存页面并显示错误消息。因此,我需要告诉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不要在当前请求上缓存任何内容?

1 个答案:

答案 0 :(得分:0)

具体文件夹中的BlockController将这些受保护变量设置为标准:

protected $btCacheBlockRecord = true;
protected $btCacheBlockOutput = false;
protected $btCacheBlockOutputOnPost = false;
protected $btCacheBlockOutputForRegisteredUsers = false;

因此,如果您将block controller.php上的所有这些设置为false,则不应缓存您的块。

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;

在' if'当对API的调用失败时:

$currentPage = Page::getCurrentPage();
$cache = PageCache::getLibrary();
$cache->purge($currentPage);

发现于:https://www.concrete5.org/community/forums/5-7-discussion/programmatically-expiring-pages-from-cache