このリポジトリはPHP Webアプリフレームワークである、LaravelのLTSバージョンである5.5の公式英文ドキュメントを日本語へ翻訳しています。
This project is maintained by okinaka
{tip} Bladeテンプレートをどう書いたら良いのかをもっと知りたいですか?取り掛かるには、Bladeのドキュメントを確認してください。
ビューはアプリケーションとして動作するHTMLにより構成されており、コントローラ/アプリケーションロジックをプレゼンテーションロジックから分離します。ビューはresources/views
ディレクトリに保存します。 シンプルなビューは、以下のような形態です。
<!-- resources/views/greeting.blade.phpとして保存されているビュー -->
<html>
<body>
<h1>Hello, </h1>
</body>
</html>
このビューをresources/views/greeting.blade.php
として保存していますので、以下のようにグローバルview
ヘルパ関数を使用し結果を返します。
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
ご覧の通り、view
ヘルパに渡している最初の引数は、resources/views
ディレクトリ中のビューファイル名に対応しています。2つ目の引数は、ビューで使用するデータの配列です。上記の例では、ビューにname
変数を渡し、それはBlade記法を使用しているビューの中に表示されます。
もちろん、ビューはresources/views
ディレクトリのサブディレクトリにネストすることもできます。ネストしたビューを参照するために「ドット」記法が使えます。例えば、ビューがresources/views/admin/profile.blade.php
として保存するなら、次のように指定します。
return view('admin.profile', $data);
ビューが存在しているかを判定する必要があれば、View
ファサードを使います。ビューが存在していれば、exists
メソッドはtrue
を返します。
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
first
メソッドは、指定したビュー配列の中で、最初に存在するビューを作成します。これはアプリケーションやパッケージで、ビューをカスタマイズ、上書きする場合に役立ちます。
return view()->first(['custom.admin', 'admin'], $data);
もちろん、View
ファサードを使い、このメソッドを呼び出すこともできます。
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
前例で見たように、簡単にデータを配列でビューに渡せます。
return view('greetings', ['name' => 'Victoria']);
この方法で情報を渡す場合、その情報はキー/値ペアの配列です。ビューの中で各値へは対抗するキーでアクセスできます。たとえば<?php echo $key; ?>
のように表示可能です。全データをview
ヘルパ関数に渡す代わりに、with
メソッドでビューに渡すデータを個別に追加することもできます。
return view('greeting')->with('name', 'Victoria');
アプリケーションでレンダーする全ビューに対し、一部のデータを共有する必要があることも多いと思います。Viewファサードのshare
メソッドを使ってください。 通常、サービスプロバイダのboot
メソッド内でshare
を呼び出します。AppServiceProvider
に追加しても良いですし、独立したサービスプロバイダを作成することもできます。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* アプリケーションサービスの初期処理
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
}
/**
* サービスプロバイダ登録
*
* @return void
*/
public function register()
{
//
}
}
ビューコンポーザはビューがレンダーされる時に呼び出される、コールバックかクラスメソッドのことです。ビューがレンダーされるたびに結合したい情報があるなら、ビューコンポーザがロジックを一箇所にまとめるのに役立ちます。
この例のサービスプロバイダの中に、ビューコンポーザを組み込みましょう。View
ファサードの裏で動作している、Illuminate\Contracts\View\Factory
契約の実装にアクセスします。Laravelはデフォルトのビューコンポーザ置き場を用意していないことに注意してください。お好きな場所に置くことができます。たとえば、app\Http\ViewComposers
ディレクトリを作成することもできます。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* コンテナ結合の登録
*
* @return void
*/
public function boot()
{
// クラスベースのコンポーザを使用する
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
// クロージャベースのコンポーザを使用する
View::composer('dashboard', function ($view) {
//
});
}
/**
* サービスプロバイダ登録
*
* @return void
*/
public function register()
{
//
}
}
{note} 新しいサービスプロバイダをビューコンポーザ登録のために作成したら、
config/app.php
設定ファイルのproviders
配列へ追加する必要があるのを忘れないでください。
ではprofile
ビューがレンダーされるたび実行される、ProfileComposer@compose
メソッドをコンポーザとして登録してみましょう。まず、このコンポーザクラスを定義します。
<?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use App\Repositories\UserRepository;
class ProfileComposer
{
/**
* userリポジトリの実装
*
* @var UserRepository
*/
protected $users;
/**
* 新しいプロフィールコンポーザの生成
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
// 依存はサービスコンテナにより自動的に解決される
$this->users = $users;
}
/**
* データをビューと結合
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
ビューがレンダーされる直前に、Illuminate\View\View
インスタンスに対しコンポーザのcompose
メソッドが呼びだされます。
{tip} すべてのビューコンポーザはサービスコンテナにより依存解決されます。ですから、コンポーザのコンストラクターで必要な依存をタイプヒントで指定できます。
複数のビューにビューコンポーザを適用するには、composer
メソッドの最初の引数にビューの配列を渡してください。
View::composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
全ビューコンポーザに適用できるように、composer
メソッドでは*
をワイルドカードとして使用できます。
View::composer('*', function ($view) {
//
});
ビュークリエイターは、ビューコンポーザとほぼ同じ働きをします。しかし、ビューがレンダーされるまで待つのではなく、インスタンス化されるとすぐに実行されます。ビュークリエイターを登録するには、creator
メソッドを使います。
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');