2016-11-16 3 views
0

すべてのビューに渡したいデータがあります。私はCodeIgniter 3を使用しており、PHP 7を利用できます。現在の私のやり方は、すべての機能でこのようなものを使用していることです。OOPとDRYを使用してモデルからすべてのビューにデータを取得

$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); 

これはやや上手ですが、それでもすべての機能にこの行が表示されます。

私の機能は、foobarが既に設定された$dataを幾つか継承したいと思います。私はパラメータとして$dataを受け取るすべての関数を必要とする解決策を避けることを望むでしょう。どうすればこれを達成できますか?

答えて

3

オプション1: ないあなたはこれを試してみましたが、あなたはそれを設定し、あなたのコンストラクタに続いて、あなたのクラスのプロパティとして

protected $data = []; 

を$データを設定することができれば確認してください。

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

これはあなたの$データは、お使いのコントローラ内のすべてのメソッドにアクセスできるようになり、あなたが$this->data['data_name']としてそれらを参照して

$this->load->view('homepage', $this->data); 

オプション2のようなビューでそれを使用する必要がありますを意味します: 2番目の方法は、ビューを読み込んで既存のビュー呼び出しを置き換えるすべてのメソッドに共通のrender()のようなメソッドを作成することです。

だから、何かのような...私と理解することが私のコードは非常にクリーンかつ容易になったための優れた1つの作品は、あなたに感謝

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); 
    } 
+0

オプションを持っているでしょう。 – Goose

+0

あなたは大歓迎です:) – TimBrownlaw

関連する問題