LaravelのViewComposerを利用してViewの共通データを管理
LaravelのViewComposerを利用してViewの共通データを管理します。複数のControllerからViewに値を渡す処理をなくし、処理の共通化とControllerのスリム化を目指します。
[ 目次 ]
はじめに
こんにちは、香港に住んでいるWEBデベロッパーのなかむ(@nakanakamu0828)です。
今回はViewComposerを利用して、Viewに共通データを渡すようにしたいと思います。
前回の「LaravelにてEnumを導入する」では、Enumで性別データを管理するようにしました。
この性別データの配列をViewでは、性別のプルダウンとして表示できるように実装していきます。
■ 環境
ライブラリ | バージョン |
---|---|
PHP | ^7.1.3 |
Laravel | 5.6.* |
laravel-enum | ^1.10 |
ComposerServiceProviderを用意する
ComposerServiceProviderを作成
$ php artisan make:provider ComposerServiceProvider
app/Providers
ディレクトリ配下にComposerServiceProvider.php
が作成されます
中身の実装は後ほど追加していきます。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use View;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
}
config/app.phpのprovidersにComposerServiceProviderを追加
'providers' => [
・・・
App\Providers\ComposerServiceProvider::class,
],
SexComposerを用意する
SexComposer.php作成
性別のEnumデータを配列として返却するComposerを用意します。
app/Http/ViewComposers/SexComposer.php
を以下の内容で作成します。
<?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use App\Enums\User\Profile\Sex;
class SexComposer {
/**
* @var String
*/
protected $sexes;
public function __construct()
{
$this->sexes = Sex::toArray();
}
/**
* Bind data to the view.
* @param View $view
* @return void
*/
public function compose(View $view)
{
// Viewからは $sexesでアクセスできるようになります
$view->with('sexes', $this->sexes);
}
}
ComposerSeriviceProvider.php修正
ComposerSeriviceProvider.phpのbootファンクション内にSexComposerの設定を追加していきます。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Http\ViewComposers\SexComposer;
use View;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
View::composers([
SexComposer::class => [
'*' // Viewsディレクトリの構造を元に設定。全ての画面で利用する場合、*(アスタリスクを利用する)
]
]);
}
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
}
利用方法
それでは性別のプルダウンを用意してみます。
<select name="sex">
@foreach($sexes as $k => $v)
<option
value="{{ $v }}"
@if($profile->sex === $v) selected @endif
>
{{ __('enum.user_profile.sex.' . strtolower($k)) }}
</option>
@endforeach
</select>
最後に
Laravelは機能が豊富です。以下に「綺麗なコードを書くか?冗長なコードをなくすか?楽に実装できるか?」を考えながら自分の中でのベストプラクティスを見つけていきましょう。