やりたいこと
複数のViewで使うデータを一箇所でまとめて処理してViewに渡したい
手順
ViewComposerの説明はこちらの中程にあります。
ViewComposerはViewがレンダーされる時に呼び出されるので、それに情報を結合することができます。
ServiceProviderの作成
まずは以下のコマンドでServiceProviderを作成します。
php artisan make:provider ComposerSeriviceProvider
するとApp\ProvidersにComposerSeriviceProvider.phpができます。
App\Providers\ComposerSeriviceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerSeriviceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
config\app.phpへ登録
作成したServiceProviderをconfig\app.phpの'providers'
へ追記します。
app.php
'providers' => [
App\Providers\ComposerSeriviceProvider::class,
],
ViewComposerの作成
app/HttpにViewComposersディレクトリを作成し、そこにViewComposerを作成します。
ここに行いたい処理を書きます。
App\Http\ViewComposers\NameComposer.php
<?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
class NameComposer {
protected $name;
public function __construct()
{
$this->name = 'bubbles';
}
/**
* Bind data to the view.
*/
public function compose(View $view)
{
$view->with('name',$this->name);
}
}
ViewComposerを適用したいテンプレートの指定
最後にComposerSeriviceProvider.phpを以下のように書き換えます。
今回はpage配下の全てのファイルを指定します。
App\Providers\ComposerSeriviceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
use App\Http\ViewComposers\NameComposer;
class ComposerSeriviceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
View::composers([
NameComposer::class => [
'page.*',
]
]);
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
適用したいテンプレートが増えたら追記していけばOKです。
手順は以上です。
('v')
ヘッダーやフッターやサイドバーで使用するデータといった、全ページまたは多くのページで共通して使用するデータは、ViewComposerでまとめるとコントローラーがすっきりして良いですね。