web開発で欠かせないJavaScript
webアプリケーションで動きをつけるならJavaScriptがまだまだ主流かと思います。
ただ、あまりにもできることが多く何でもかんでもJavaScript
に頼る開発もなんだかなと思うところもあり、今回はLaravel
でフロント側に頼りきらず全画面共通のコンポーネントを作成
する方法を紹介したいと思います。
環境
言語 : PHP 7.3.18
フレームワーク : Laravel 6.18.43
サンプル
今回はQiita
のような記事投稿ができるサービスを作っている前提で、サイドバーに項目を設けて既読の記事があれば通知を出すような機能を作ってみたいと思います。
・サイドバーは全画面共通でどの画面からも開くことができる
・各項目の横に既読があれば通知を出す
View Composer
Laravel
にはすごく便利なView Composer
が存在しそれを使えばすごく簡単にモックの様な共通処理を作成することができます。
使い方はドキュメントを見ればすぐにわかりますが、今回は汎用性も兼ね備えた実装をしたいと思います。
Providerを追加する
まずは以下コマンドでProvider
を作成します
php artisan make:provider ViewServiceProvider
後々このProvider
に最終的な処理を記述します。
Interfaceを作成する
そして、Interface
を作成しておきます。
View composer
を使うためにはcomposer
メソッドにターゲットとなるview
,compose
メソッドが必須になるのでそのメソッドが実装されたクラス名を引数に指定します。なのでそれらを作成するメソッドを必須メソッドとして管理しておきます。
compose
メソッドについて後々説明します。
また、使用したいblade
ファイルは複数指定が可能なので、PHPDoc
でarray
が使用可能なのも記述しておきます。
<?php
declare(strict_types=1);
use Illuminate\View\View;
interface ViewComposer
{
/**
* @return string|array
*/
public static function getTargetComponents();
/**
* @param View $view
*/
public function compose(View $view): void;
}
具象クラスを実装する
先ほど作成した抽象クラス(Interface
)の具象クラスを実装します。
getTargetComponents
メソッドは対象としたいview
を返す, compose
メソッドにはblade
ファイルで使用したい変数とデータを返すように実装していきます。
<?php
declare(strict_types=1);
use Illuminate\View\View;
class SidebarCompose implements ViewComposer
{
public static function getTargetComponents(): string
{
return 'parts.sidebar';
}
/**
* @param View $view
*/
public function compose(View $view): void
{
$view->with('countPer', APIなどで取得した各項目ごとの件数データなど);
}
}
今回使用したいのはサイドバーなので、parts/sidebar.blade.php
の様なディレクトリ構造を想定してparts.sidebar
と指定します。
compose
でwith
メソッドの中に第一引数に変数を, 第二引数に変数に格納するデータを指定します。
Providerで使える様にする
一番最初に作成したViewServiceProvider
に実際に使えるように処理を追記します。
declare(strict_types=1);
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
use PrtimesAdmin\View\Composers\SidebarCompose;
class ViewServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
View::composer(SidebarCompose::getTargetComponents(), SidebarCompose::class);
}
}
View
ファサードを使用し、composer
を呼び出します。
第一引数に、使用したいblade
ファイルを指定するので、先ほど実装したSidebarCompose
クラスからgetTargetComponents
を呼び、第二引数には呼び出すクラスを指定するのでclass
をそのまま指定します。
composer
メソッドは、第二引数に指定されたクラス名に実装されているcompose
メソッドを呼び出し第一引数に指定されたview
で適用できるようにしてくれます。
bladeファイルで作成した変数を使う
最後にblade
側で変数を記述すれば実際に表示できる様になります。
<div>
.
.
.
<p>{{ $countPer }}</p>
</div>
JavaScriptに頼りきらないLaravel開発
今回紹介した機能はJavaScript
だと例えばページが読み込まれたときに表示するような処理が実装できるかと思います。
余裕があればそうすれば良さそうですね。
しかし、チーム開発をしているとフロント側の実装者が少なくフロントの工数をあまり使いたくない場合も出てくるかと思います。そんなときにJavascript
に頼らずバックエンドで実装してしまうのも手かと思います。