こんにちは!タクマです。
31歳未経験からエンジニア転職に成功し、
2021年3月より都内の受託開発企業にてサーバーサイドエンジニアとして働いており、
PHP/Laravel、Vue.jsを使用し開発をしています。
今回は、Laravelのview composerについて解説します。
view composerってなに?
view composerの使い方がわからない
という方はこの記事を読めばview composerの機能と使い方がわかるようになりますので、ぜひ最後まで読んでください!
view composerとは?
view composerとは、ビューを表示するビジネスロジックをコントローラから分離して1つの場所に集約して記述するための仕組みです。
そしてルートやコントローラを問わず常に特定のデータをビューに返すことができます。
view composerの実装方法
サービスプロバイダーの用意
まず、view composerを登録するサービスプロバイダーを作成します。
下記のartisanコマンドで作成することができます。
$ php artisan make:provider ViewComposerServiceProvider
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
config/app.phpに登録
先ほど作成したViewComposerServiceProvider
をconfig/app.php
に登録します。
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* Package Service Providers...
*/
/*
* Application Service Providers...
*/
App\Providers\ViewComposerServiceProvider::class, // 追加
],
Composerクラスの作成
app/View/Composer
というディレクトリを作成し、Composerディレクトリの中にHeaderComposer.php
を作成します。
(※今回は例として、ヘッダー用のViewComposerを作成するため、HeaderComposer.php
としました。このComposerクラスのファイル名は任意のもので結構です。)
<?php
namespace App\View\Composers;
use App\Repositories\Contracts\AuthContract;
use Illuminate\View\View;
class HeaderComposer
{
protected $authRepository;
/**
* constructor
*
* @param AuthContract $authRepository
*/
public function __construct(AuthContract $authRepository)
{
$this->authRepository = $authRepository;
}
/**
* viewにログインユーザーのステータスを常に結合して渡す
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$authUser = $this->authRepository->getAuthUser();
$view->with([
'status' => $authUser->status
]);
}
}
この記述により対象の(後ほど解説します。)bladeファイルにログインユーザーのステータスが常に渡させるようになりました。
サービスプロバイダーへの登録
始めに作成したサービスViewComposerServiceProvider
に先ほど作成したHeaderComposer.php
を登録します。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\View\Composers\HeaderComposer;
class ViewComposerServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
View::composers([
// header.blade.phpにHeaderComposerで結合した$statusが常に渡される
HeaderComposer::class => 'header'
]);
}
}
これによりheader.blade.php
にログインユーザーのステータスが常に渡させるようになりました。
bladeファイルで渡された変数を活用する
@if ($status === 1)
<a class="link" href="{{ route('contract.form') }}">
契約する
</a>
@else
<a class="link" href="{{ route('contract.index') }}">
契約状況を確認
</a>
@endif
これで、header.blade.phpでは常に、$status
という変数が使えるようになりました。
header.blade.phpはどのbladeファイルにも
@include('header)
のようにして呼び出しているので、結果、ルート・コントローラーを問わず、$status
が渡される訳です。
サービスプロバイダーへの登録方法(その他)
先ほどサービスプロバイダーでの登録処理は、header.balde.php
のみへの登録でしたが、その他のbladeファイルへの登録をする場合も解説します。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\View\Composers\HeaderComposer;
class ViewComposerServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
View::composers([
AppComposer::class => '*', // 全てのbladeファイルに渡される
AppComposer::class => 'user.*', // userディレクトリ以下全てのbladeファイルに渡される
AppComposer::class => 'user.index' // userディレクトリのindex.blade.phpに渡される
]);
}
}
上記のようにすることで、全てのbladeファイルに渡したり、特定のディレクトリ以下にだけ渡したり、特定のbladeファイルにだけ渡したりすることができます。
さいごに
いかがでしたでしょうか?
view composerの使い方ついて理解できましたでしょうか?
ご質問やご指摘等ある方はコメントしていただければ返信させていただきます。
これからもLaravelエンジニアの方、Laravel学習中の初学者の方に役に立つ記事を更新していきますのでよろしくお願いします!
Twitterでも情報発信をしていますので、よかったらフォローをお願いします(^^)