#自己紹介
初めまして、kotobukiと申します。
以前PHPでwebアプリを初めて0から開発した際につまづいた点を残しておらず後悔したので、
今後そのようなことがないように始めてみました。
これからの学習や個人開発でのつまづきポイントや疑問などを投稿していこうと思います。
おそらく初学者の方々も同じような部分でつまづくと思うので、参考になれば幸いです。
・開発したアプリ
逆タン!!-タンパク質量から食材の量を逆算-
#概要
本記事は、PHPフレームワークLaravel入門 第2版で学習している中の疑問・つまづきの備忘録です。
今回はビューコンポーザの利用でつまづいた点について原因と解決策をまとめます。
#今回起こったエラー
今回は以下のエラーが発生しました。
Method Illuminate\View\View::composer does not exist.
- ソースコード
<?php
namespace App\Providers;
use Facade\FlareClient\View;
use Illuminate\Support\Facades\App;
use Illuminate\Support\ServiceProvider;
class HelloServiceProvider extends ServiceProvider
{
public function boot(){
//このcomposerメソッドが存在しないエラー
View::composer('hello.index', function ($view) {
$view->with('view_message', 'composer message!');
});
}
//以下省略
}
##原因
原因はエラーの通り、Illuminate\View\Viewクラスにcomposerメソッドが存在しないことです。
これは、実際にViewクラスのソースコードを確認していただければわかります。
さらに以下のリファレンスによると、ここで使用しているView::composer()はViewファサードというものでした。
したがって、名前空間のエイリアスを新たに作成し参照する必要がありました。
Viewファサードのcomposerメソッドを使用して、ビューコンポーザを登録します。
Laravelには、クラスベースのビューコンポーザーのデフォルトディレクトリが含まれていないため、自由に整理できます。たとえば、app/View/Composersディレクトリを作成して、アプリケーションのすべてのビューコンポーザを保存できます。
##解決策
HelloServiceProvider.phpに「use Illuminate\Support\Facades\View」を追記します。
なぜIlluminate\Support\Facades名前空間のViewを指定するのかは、以下のリファレンスに記載があります。
Laravelのファサードはすべて、Illuminate\Support\Facades名前空間で定義します。したがって、次のようなファサードに簡単にアクセスできます。
Laravel 8.x ファサード
また、今回はすでにuse Facade\FlareClient\View;が存在するため別名として「FacadesView」を付けています。
<?php
namespace App\Providers;
use Facade\FlareClient\View;
use Illuminate\Support\Facades\App;
use Illuminate\Support\ServiceProvider;
///////////この部分を追加
use Illuminate\Support\Facades\View as FacadesView;
///////////この部分を追加
class HelloServiceProvider extends ServiceProvider
{
public function boot(){
FacadesView::composer('hello.index', function ($view) {//別名であるFacadesViewを指定
$view->with('view_message', 'composer message!');
});
}
//以下省略
}
#参考文献