laravel-admin のテンプレート構造

laravel-admin ではコテコテの blade テンプレートによるレイアウト実装がなされています。かつ、テンプレート群は vendor 以下に格納されているため、レイアウトの編集が非常にしづらいです(逆に言えば、不用意なレイアウトバグを埋め込みにくいです)

blade テンプレートエンジンでは @include ディレクティブによりあるテンプレートから他のテンプレートファイルを読み込むことができます。この際、変数のスコープは同一なので親テンプレートの変数を@includeした子テンプレートから参照できますが、スコープ管理が煩雑になるため @include の第2引数でテンプレートパラメータとして明示的に渡す方が保守性に優れています。

また、Laravel においては一般的に各コントローラーのアクションメソッドは return view により対応するビューのインスタンス(Illuminate\View\View)を生成して返すのですが、Laravel-adminのアクションメソッドはそのようには実装されていません。これは、元々のビューインスタンスが Illuminate/Contracts/View/View (のさらに基底となるIlluminate\Contracts\Support\Renderable)を実装しているのと同じように、Laravel-admin の Grid であったり Show であったりが、Renderable を継承しているため、render を呼び出す(描画する)ことができるためです。ビューのインスタンスを view ヘルパで返す場合は、例えばview(‘foo’)と記述するとresources/viewフォルダの中にあるfoo.blade.phpまたはfoo.phpというファイルが呼び出され、その結果がブラウザ上に出力されます

laravel-admin で各動作に対応するテンプレートを特定するやり方として、コントローラーアクションメソッドの中で、詳細表示用のメソッドである detail() を例に解説します。こちらは Encore\Admin\Show のインスタンスを return しているので vendor/encore/laravel-admin/src/Show.php の実装を確認します。すると

return view('admin::show', $data)->render();

という記載があるので「ああ、これは panel にモデル自身の情報を、relations にモデルのリレーショナルな情報を格納して、テンプレートパラメータとしてadmin::showに渡しているのだな」ということがわかります。そして vendor/encore/laravel-admin/resources/views/show.blade.php では

<div class="col-md-12">
    {!! $panel !!}
</div>

としてパネル自身の render が行われるのですが、この時展開されるテンプレートは

protected $view = 'admin::show.panel';

として指定されているので、vendor/encore/laravel-admin/resources/views/show/panel.blade.php となり、さらに

<div class="form-horizontal">
    <div class="box-body">
        <div class="fields-group">
            @foreach($fields as $field)
                {!! $field->render() !!}
            @endforeach
        </div>
    </div>
    <!-- /.box-body -->
</div>

の記述からは vendor/encore/laravel-admin/src/Show/Field.php のrender が行われ admin::show.field が展開されていることがわかります。まとめると larave-admin における詳細ページは

resources/views/index.blade.php ルートテンプレート
resources/views/content.blade.php コンテンツテンプレート
resources/views/show.blade.php メインとなるビューのテンプレート
resources/views/show/panel.blade.php モデルの詳細テンプレート
resources/views/show/field.blade.php モデルの各フィールドのテンプレート

という階層構造を持っている、ということになります。