通常、MVCモデルのフレームワークでは、viewを呼び出す際に変数を引数として渡すのが一般的で、CodeIgniterももちろんその例に漏れず、以下のように呼び出すのはCodeIgniterの初歩の初歩で通る道である。
namespace App\Controllers;
use CodeIgniter\Controller;
class Hoge extends Controller
{
public function index()
{
$data['hoge'] = 'fuga';
return view('fuga', $data);
}
}
echo $hoge;
// fuga
ここで、viewの中に更にviewを呼び出そうとすると
echo $hoge;
// fuga
echo view('piyo', ['hoge' => 'fuga']);
echo $hoge;
// fuga
とするのが一般的な方法で、引数がリスト用の配列だったりした場合はここをループで回しながら使うケースも多い。
これだけなら特筆することではないが、CodeIgniterではなんと、引数を省略すると親viewの引数をそのまま再利用してくれる機能がある。
view in view に引数を省略すると親viewの引数を引き継げる
echo $hoge;
// fuga
// 引数を指定しない
echo view('piyo');
echo $hoge;
// fuga(親viewの変数を引き継ぐ)
これが地味に便利で、同一viewの中で条件によって表示が大きく変わるようなときに意外と重宝する。
コントローラではDBやモデルの結果だけを持って、変数にHTMLを持ったりしなくて良くなるのが個人的に嬉しい。
私はこれ(view in view)でレイアウトも作成してしまっている。
CodeIgniter3のviewの説明(Loading multiple views)にある
$this->load->view('header');
$this->load->view('menu');
$this->load->view('content', $data);
$this->load->view('footer');
これがすごく気持ち悪く感じたのが発端である。
これをページ毎に記述して、それぞれ引数持たせてログイン時は・・・などの処理をするのが億劫に感じたため、私の場合はすべてのコントローラからは layout.php を呼び出すようにして、その中で処理するようにしている。
namespace App\Controllers;
use CodeIgniter\Controller;
class Hoge extends Controller
{
public function index()
{
$data['view'] = 'content'; // メインとなるviewを変数にセットしておく
$data['hoge'] = 'fuga';
return view('layout', $data);
}
}
// すべてのviewで $view, $hoge が利用可能
// CodeIgniter4
echo view('header');
echo view('menu');
echo view($view);
echo view('footer');
// CodeIgniter3
$this->load->view('header');
$this->load->view('menu');
$this->load->view($view);
$this->load->view('footer');
注意
基本的にはやらないと思うが、親viewや子viewで対象の変数を書き換えてしまうと上書きが発生してしまうのでそこだけ注意が必要。