前提
Laravelを勉強している者です。
ネットで調べられる範囲で原因の調査を行いましたが、解決に繋がらずご相談させて下さい。
プログラム初心者ですが、ご指導ご鞭撻の程お願いします。
■環境
使用PC: Windows10
Laravel Ver: 8.73.2
勉学に使用している教材: PHPフレームワーク Laravel入門 (Amazonサイト)
■手順(※LaravelにてMiddlewareを勉強中に問題と遭遇)
1, 「Middleware」ファイルにHelloMiddlewareファイルを新規に作成。
2, 本の記載通りにHelloMiddlewareファイルにコードを記載。
3, 「Kernel.php」ファイルにHelloMiddlewareが使用できるように個別登録 ($routeMiddlewareに該当パスを記載)
4, 「web.php」にてルート情報を記載。
5, 「HelloController」にて、indexメソッドを修正
6, 「index.blade.php」のテンプレートを修正。
※最初にControllerを学ぶ際に「HelloController」を作成しており、以来はHelloControllerを使用して勉強しています。
発生している問題
現在、以下のErrorが表示されており問題の根本原因が分からない状況です。
Illuminate\Contracts\Container\BindingResolutionException Target class [HelloMiddleware] does not exist.
該当ソースコード
HelloMiddleware.php
1 2<?php 3 4namespace App\Http\Middleware; 5 6use Closure; 7use Illuminate\Http\Request; 8 9class HelloMiddleware 10{ 11 /** 12 * Handle an incoming request. 13 * 14 * @param \Illuminate\Http\Request $request 15 * @param \Closure $next 16 * @param string|null $redirectToRoute 17 * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse|null 18 */ 19 public function handle($request, Closure $next) 20 { 21 $data = [ 22 ['name'=>'takoyaki', 'mail'=>'tako@google.com'], 23 ]; 24 $request->merge(['data'=>$data]); 25 return $next($request); 26 } 27}
Kernel.php
1 2 protected $routeMiddleware = [ 3 'auth' => \App\Http\Middleware\Authenticate::class, 4 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 5 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 6 'can' => \Illuminate\Auth\Middleware\Authorize::class, 7 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 8 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 9 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 10 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 11 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 12 'hello' => \App\Http\Middleware\HelloMiddleware::class, 13 ]; 14} 15 16※$routeMiddleware部分以外は割愛(特に操作していないので)
web.php
1 2<?php 3 4use Illuminate\Support\Facades\Route; 5use App\Http\Controller\HelloController; 6 7/* 8|-------------------------------------------------------------------------- 9| Web Routes 10|-------------------------------------------------------------------------- 11| 12| Here is where you can register web routes for your application. These 13| routes are loaded by the RouteServiceProvider within a group which 14| contains the "web" middleware group. Now create something great! 15| 16*/ 17 18Route::get('hello', 'HelloController@index')->middleware(HelloMiddleware::class); 19 20Route::post('hello', 'HelloController@post'); 21
HelloController.php
1 2<?php 3 4namespace App\Http\Controllers; 5 6use Illuminate\Http\Request; 7use Illuminate\Http\Response; 8 9 10class HelloController extends Controller{ 11 12 public function index(Request $request) 13 { 14 return view('hello.index', ['data'=>$request->data]); 15 } 16 17 public function post(Request $request) 18 { 19 return view('hello.index', ['msg'=>'正しい']); 20} 21 22} 23
index.blade.php
1 2@extends('layouts.helloapp') 3@section('title', 'Index') 4 5@section('content') 6 <p>ここが原点</p> 7 8 <table> 9 @foreach($data as $item) 10 <tr> 11 <th>{{$item('name')}}</th> 12 <td>{{$item('mail')}}</td> 13 </tr> 14 @endforeach 15 </table> 16 17@endsection 18
試したこと
・キャッシュのクリア
php artisan cache:clear; php artisan config:clear; php artisan route:clear; php artisan view:clear; composer dump-autoload で実行。
・web.phpファイルにてHelloMiddlewareの指定を変更
旧:Route::get('hello', 'HelloController@index')->middleware(HelloMiddleware::class);
新:Route::get('hello', 'HelloController@index')->middleware('hello');
・app/Providers/RouteServiceProvider.phpで定義されているデフォルトのネームスペースにて、コメントアウトしていない事を確認。また、Punbic bootの 'api'&'web' に「->namespace($this->namespace)」の一文を記述。(詳細は下記)
RouteServiceProvider.php
1 2<?php 3 4namespace App\Providers; 5 6use Illuminate\Cache\RateLimiting\Limit; 7use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; 8use Illuminate\Http\Request; 9use Illuminate\Support\Facades\RateLimiter; 10use Illuminate\Support\Facades\Route; 11 12class RouteServiceProvider extends ServiceProvider 13{ 14 /** 15 * The path to the "home" route for your application. 16 * 17 * This is used by Laravel authentication to redirect users after login. 18 * 19 * @var string 20 */ 21 public const HOME = '/home'; 22 23 /** 24 * The controller namespace for the application. 25 * 26 * When present, controller route declarations will automatically be prefixed with this namespace. 27 * 28 * @var string|null 29 */ 30 protected $namespace = 'App\Http\Controllers'; 31 32 /** 33 * Define your route model bindings, pattern filters, etc. 34 * 35 * @return void 36 */ 37 public function boot() 38 { 39 $this->configureRateLimiting(); 40 41 $this->routes(function () { 42 Route::prefix('api') 43 ->middleware('api') 44 ->namespace($this->namespace) 45 ->group(base_path('routes/api.php')); 46 47 Route::middleware('web') 48 ->namespace($this->namespace) 49 ->group(base_path('routes/web.php')); 50 }); 51 } 52 53 /** 54 * Configure the rate limiters for the application. 55 * 56 * @return void 57 */ 58 protected function configureRateLimiting() 59 { 60 RateLimiter::for('api', function (Request $request) { 61 return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); 62 }); 63 } 64}
###最後に
以上が私の現状です。何か不明点あればお手数ですがご連絡頂きたいです。
お手数ですがご教示よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/14 08:05 編集