質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

1回答

2145閲覧

【Laravel】作成したMiddlewareファイルが使用できない

Kushi

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2022/01/13 09:58

前提

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}

###最後に

以上が私の現状です。何か不明点あればお手数ですがご連絡頂きたいです。
お手数ですがご教示よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

web.phpに追加。

php

1use App\Http\Middleware\HelloMiddleware;

もしくはミドルウェアの指定方法を変える。

php

1Route::get('hello', 'HelloController@index')->middleware('hello');

$routeMiddlewareの'hello' => \App\Http\Middleware\HelloMiddleware::class,helloだけで使えるようにするためのもの。
フルのApp\Http\Middleware\HelloMiddlewareで使うなら$routeMiddlewareへの登録はしなくてもいい。

$routeMiddlewareに登録して省略した形

php

1Route::get('hello', 'HelloController@index')->middleware('hello');

↓省略しない形

php

1Route::get('hello', 'HelloController@index')->middleware(App\Http\Middleware\HelloMiddleware::class);

php

1use App\Http\Middleware\HelloMiddleware; 2 3Route::get('hello', 'HelloController@index')->middleware(HelloMiddleware::class);

RouteServiceProviderでnamespace指定してるのを元に戻してLaravel8以降の使い方に慣れていればミドルウェアも::classを使う方法が自然だと理解できる。

php

1use App\Http\Controllers\HelloController; 2use App\Http\Middleware\HelloMiddleware; 3 4Route::get('hello', [HelloController::class, 'index'])->middleware(HelloMiddleware::class);

投稿2022/01/13 11:14

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kushi

2022/01/14 08:05 編集

kawaxさん 丁寧にご説明頂きありがとうございます。 ご教示頂いた一文で、1点不明点があったので再度ご質問させて下さい。 >>RouteServiceProviderでnamespace指定してるのを元に戻して... 上記一文の指している「namespace」とは、RouteServiceProviderの「->namespace($this->namespace)」の部分を指しているのでしょうか? お手数ですがご教示頂けると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問