Laravelでビューコンポーザーを利用するメモ
ビューコンポーザーとは
ビューのロジックはコントローラーや、テンプレートに書きたくない問題を解決する機能です。 ビューコンポーザーはビューをレンダリングする際に自動的に実行されます。
ビューコンポーザーの処理はコントローラーからは見えません。 コントローラーで処理する必要がある場合は、ビューコンポーザーは利用できません。
ビューで必ず行われる処理を実行する際に利用します。
サービスプロバイダについて
ビューコンポーザーを利用する場合には、サービスプロバイダという仕組みを利用します。
サービスプロバイダは以下のコマンドで作成できます。
php artisan make:provider MyServiceProvider
サービスプロバイダのファイルはapp/Providers
フォルダ内に作成されます。
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class MyServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register() { // } /** * Bootstrap services. * * @return void */ public function boot() { // } }
ソースコードの中にある、boot
メソッドはアプリケーションが起動するときに、割り込んで実行される処理です。 register
は必要なサービスの登録を行う為に利用します。
ビューコンポーザーを定義する
ビューコンポーザーを定義してみます。
View::composer(ビューファイルの指定,無名関数orクラス)
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\View; //← 追加 class MyServiceProvider extends ServiceProvider { /** * Bootstrap services. * * @return void */ public function boot() { View::composer( 'index', function ($view) { $view->with('message', 'こんにちは!'); } ); } }
サービスプロバイダを登録する
次に作成したサービスプロバイダをアプリケーションに登録します。 登録は/config/app.php
のproviders
の項目にします。 ここに登録することで、アプリケーション起動時に登録されて、利用できるようになります。
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
...中略...
APP\Providers\MyServiceProvider::class
],
ビューコンポーザーを利用してみる
{{$message}}
表示
こんにちは!
ビューコンポーザーをクラスで定義してみる
まずはapp/Http/Composers/MyComposer.php
を作成します。 クラスの作成場所はどこでも良いみたいです。
<?php namespace App\Http\Composers; use Illuminate\View\View; class MyComposer { public function compose(View $view) { $view->with('message','こんにちは'); } }
作成したクラスを利用する為に、サービスプロバイダに定義します。
class MyServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
View::composer('hello.index','App\Http\Composers\HelloComposer');
}
}
表示
こんにちは!
複数のファイルで共有する
ビューコンポーザーは複数のビューで共通して利用されることが多いと思います。 複数で利用する場合はサービスプロバイダを以下のようにします。
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\View; use App\Http\Composers\MyComposer; class MyServiceProvider extends ServiceProvider { /** * Bootstrap services. * * @return void */ public function boot() { View::composers([ MyComposer::class => [ 'index', 'mypage' ] ]); } }