1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CodeIgniterAdvent Calendar 2020

Day 9

Codeigniterのview in viewには引数はなくてもいい

Last updated at Posted at 2020-12-08

通常、MVCモデルのフレームワークでは、viewを呼び出す際に変数を引数として渡すのが一般的で、CodeIgniterももちろんその例に漏れず、以下のように呼び出すのはCodeIgniterの初歩の初歩で通る道である。

app/Contorllers/Hoge.php
namespace App\Controllers;
use CodeIgniter\Controller;
class Hoge extends Controller
{
    public function index()
    {
        $data['hoge'] = 'fuga';
        return view('fuga', $data);
    }
}
app/Views/fuga.php
echo $hoge; 
// fuga

ここで、viewの中に更にviewを呼び出そうとすると

app/Views/fuga.php
echo $hoge; 
// fuga

echo view('piyo', ['hoge' => 'fuga']);
app/Views/piyo.php
echo $hoge; 
// fuga

とするのが一般的な方法で、引数がリスト用の配列だったりした場合はここをループで回しながら使うケースも多い。
これだけなら特筆することではないが、CodeIgniterではなんと、引数を省略すると親viewの引数をそのまま再利用してくれる機能がある。

view in view に引数を省略すると親viewの引数を引き継げる

app/Views/fuga.php
echo $hoge; 
// fuga

// 引数を指定しない
echo view('piyo');
app/Views/piyo.php
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 を呼び出すようにして、その中で処理するようにしている。

app/Contorllers/Hoge.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);
    }
}
layout.php
// すべての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で対象の変数を書き換えてしまうと上書きが発生してしまうのでそこだけ注意が必要。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?