使用 OOP 和 DRY 从模型获取数据到每个视图

Get data from model to every view using OOP and DRY

我有一段数据要传递给每个视图。我正在使用 CodeIgniter 3 并且可以使用 PHP 7。我目前的做法是在每个函数中使用类似的东西。

$data['foobar'] = $this->general_model->foobar();
// More code
$this->load->view('homepage', $data);

我不想在每个函数上都调用 $data['foobar'] = $this->general_model->foobar();

我已经尝试了很多方法来解决这个问题,而没有诉诸任何使代码过于愚蠢的方法。我试过构造函数、自动加载和挂钩。每种情况下的问题都归结为 $data 对于每个函数都是局部的。我得到的最好的通常是这样的。

$data['foobar'] = $this->foobar;
// More code
$this->load->view('homepage', $data);

这稍微好一点,但它仍然导致我将这一行放在每个函数中。

我希望我的函数能够以某种方式继承 $data 并且已经设置了索引 foobar。我宁愿避免需要每个函数接收 $data 作为参数的解决方案。我怎样才能做到这一点?

选项 1: 不确定您是否尝试过这个,但您可以将 $data 设置为 class

的 属性
protected $data = [];

然后在你的构造函数中设置它。

$this->data['foobar'] = $this->general_model->foobar();

这意味着您的 $data 可以被控制器中的所有方法访问,您需要将它们称为 $this->data['data_name'] 并在类似

的视图中使用它
$this->load->view('homepage', $this->data);

选项 2: 第二种方法是创建一个像 render() 这样的方法,它对所有加载视图和替换现有视图调用的方法都是通用的。

所以你会得到类似...

  public function one_of_my_methods(){
        $data['content'] = 'This is content 1';
        $this->render('test_view',$data); // Call the new view handler
    }

    // All methods using views now call this to load the final view
    public function render($view,$data){
        $data['foobar'] = 'I am common'; // DRY
        $this->load->view($view, $data);
    }