laravel 5テンプレートのテーマ機能を実現する


周知のように、laravelレンダリングテンプレートはView:make()によって実現され、テンプレートファイルパスを明示的に指定する必要がある:

function index()
{
    return View::make('index.index');
}
このようにすれば、私達は自分でテンプレートのテーマ機能を実現できます。テンプレートのファイルをテーマ名に対応するディレクトリに置くだけでいいです。たとえば、デフォルトのテーマがdefaultなら、このように書きます。

function index()
{
    return View::make('default.index.index');
}
カスタムテーマcustom:

function index()
{
    return View::make('custom.index.index');
}
設定ファイルから件名を読み込む:

function index()
{
    return View::make(Config::get('app.theme','default').'.index.index');
}
このように基本的にテンプレートのテーマ化機能を実現しましたが、まだ問題があります。つまり、customテーマはすべてのdefaultテーマのすべてのテンプレートを実現しなければなりません。そうしないと、いくつかのページテンプレートファイルにエラーがないようになります。

function index()
{
    $theme = Config::get('app.theme','default');
    $tpl = $theme.'.index.index';
    if (!View::exists($tpl)) {
        $tpl = 'default.index.index';
    }
    return View::make($tpl);
}
テンプレートをレンダリングする前に、テンプレートファイルが存在するかどうかを確認し、存在しない場合はdefaultテーマに対応するテンプレートを使用します。
このように多くの行のコードをパッケージ化していくことができます。この時はResonseオブジェクトを使います。Resonse:view()はViewに等しいです。make()はResonseにもう一つの方法があります。macro()方法はマクロを定義するために使用できます。論理をマクロの中に入れることができます。

Response::macro('render',function($path,$data=array()){
    $theme = Config::get('app.theme','default');
    $tpl = $theme.'.'.$path;
    if (!View::exists($tpl)) {
        $tpl = 'default.' . $path;
    }
    return Response::view($tpl,$data);
});
使用:

function index()
{
    $bindings = array(
        'title' => ' '
    );
    return Response::render('index.index',$bindings);
}
注意する必要があるのは、着信テンプレートの変数がResonse:renderの第二パラメータを通過することです。
今日の教程はここまでにしましょう。後で詳しく分析してみます。お好きなように。