在库中加载视图,缓存变量问题

时间:2017-09-22 15:49:36

标签: codeigniter caching codeigniter-3 loadview

我正在尝试使用load->视图来实现小部件库。我知道我可以使用include来直接调用文件并避免vars缓存问题,但只是想知道为什么它不起作用。

以下是我构建代码的方式:

我的控制器:

class Page extends MY_Controller {

    public $data = array();

    public function __construct() {
        parent::__construct();
        ...
        $this->load->library('widgetmanager');
    }

    public function index($slug = '') {

        echo $this->widgetmanager->show(2);
        echo $this->widgetmanager->show(1);

    }
}

我的图书馆

class WidgetManager
{

    private $CI;

    public function __construct()
    {
        $this->CI = & get_instance();
    }

    public function show($widget_id) {
        $data = array();
        $widget_id = (int)$widget_id;



        $this->CI->db->select('*');
        $this->CI->db->from('widget');
        $this->CI->db->where('id', $widget_id);

        $query = $this->CI->db->get();

        $item = $query->row_array();

        $data['widget_title'] = $item['title'];
        $data['widget_content'] = $item['content'];

        $widget =  $this->CI->load->view('widget/'.$item['source'], $data, TRUE);

        $data['widget_title'] = '';
        $data['widget_content'] = '';

        $this->CI->load->view('widget/'.$item['source'], $data);

        return $widget;
    }
}

小部件1:调用小部件/内容
小部件2:调用小部件/横幅

正在发生的事情是,第一个小部件调用上设置的变量(它们与第二个小部件调用的名称相同),得到缓存,意味着第一个调用的值被传递给同一个调用。这很奇怪,因为是不同的观点。

我试过了:

  • 使用clear_vars():$ this-> CI-> load-> clear_vars(),在库上执行load->视图之前和之后。
  • 使用空数组,null等调用load->视图
  • 试图将小部件slug的前缀添加到vars中(可行,但我必须以某种方式向视图发送前缀,因此不可能发生缓存问题)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这应该是什么工作。

(我冒昧地简化了数据库调用,因此需要更少的处理。)

public function show($widget_id)
{
    $data = array();
    $widget_id = (int) $widget_id;

    $item = $this->CI->db
      ->get_where('widget', array('id' => $widget_id))
      ->row_array();

    $data['widget_title'] = $item['title'];
    $data['widget_content'] = $item['content'];

    $widget = $this->CI->load->view('widget/'.$item['source'], $data, TRUE);

    //clear the cached variables so the next call to 'show()' is clean
    $this->CI->load->clear_vars(); 

    return $widget;
}

进一步考虑调用$this->CI->load->clear_vars();可能毫无意义,因为每次调用WidgetManager::show()时,都会使用完全相同的键重新创建$data var。当$ data var传递给load->view时,$ data [' widget_title']和$ data [' widget_content']的新值将替换缓存的vars中的值使用这些键。