はむはむエンジニアぶろぐ

365日エンジニアリング

【Laravel 5.4】viewをレンダリングする仕組みを学ぶ

Laravel 5.4でviewをレンダリングする仕組みを調べてみます。
黒魔術使っている中の実装を調べてみます。

レンダリングしてみる

// コントローラ作成
php artisan make:controller FormTestController
// routes/web.php に追加
Route::get('/form_test/index', 'FormController@getIndex');


app/Http/Controllers/FormTestController.php

<?php

namespace App\Http\Controllers;

class FormTestController extends Controller
{
    public function getIndex() {
        $data = [];
        $data['sei'] = '山田';
        $data['mei'] = 'たろう';

        return view('form_test/index', $data);
    }
}


resources/views/form_test/index.blade.php

<!doctype html>
<html lang="{{ config('app.locale') }}">
    <head>
        <title>Form Test</title>
    </head>
    <body>
    <p>性: {{ $sei }}</p>
    <p>名: {{ $mei }}</p>
    </body>
</html>

http://127.0.0.1:8000/form_test/index にアクセスすれば、表示されるはずだ。

レンダリングの仕組みを調べる

view(‘form_test/index’, $data);

一体、viewとは何者なのか?
thisもついていないし、クラスの持ち物ではなさそう。

実は、オートローディングされていてヘルパー関数の一部として定義されている。


vendor/laravel/framework/src/Illuminate/Foundation/helpers.php

<?php

// 省略

if (! function_exists('view')) {
    /**
     * Get the evaluated view contents for the given view.
     *
     * @param  string  $view
     * @param  array   $data
     * @param  array   $mergeData
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
     */
    function view($view = null, $data = [], $mergeData = [])
    {
        $factory = app(ViewFactory::class);

        if (func_num_args() === 0) {
            return $factory;
        }

        return $factory->make($view, $data, $mergeData);
    }
}

うまいことViewのファクトリークラス(Illuminate\View\Factory)をコンテナから取り出している。
レンダリングのテンプレートがbladeから他のものに変わってもコンテナが取り出すファクトリークラスを差し替えれば対応できるようになっている。