0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

新規作成したLaravel9プロジェクトのbladeでaction()が使えない

Posted at

環境

Laravel 9.52.0 (新規作成したプロジェクト)

状況

下記のようなルーティングとコントローラを作成して、画面上にコントローラのURLを表示させようとしました。

web.php
Route::get('index', [HelloController::class, 'index']);
HelloController.php
<?php
namespace App\Http\Controllers;
class HelloController extends Controller
{
    public function index()
    {
        return view('index');
    }
}
index.blade.php
<p>{{ action('HelloController@index') }}</p>

すると、Action HelloController@index not defined.というエラーが発生↓
image.png

原因

Laravelが7から8にバージョンアップした際に、ルーティングの記載方法が変更になったことが原因でした。Laravel 7まではRouteServiceProviderの中に$namespaceプロパティが定義されており、このプロパティによって、action('HelloController@index')という書き方をした際に自動的に名前空間のプレフィックスがつき、'App\Http\Controllers\HelloController@index'であると解釈してくれていたみたいです。

しかし、Laravel 8以降はRouteServiceProviderから$namespaceプロパティが削除され、初期値としてnullを設定するようになりました。なので、action('HelloController@index')という書き方をすると、エラーが出てしまっていたみたいです。

解決方法

下記の方法でエラーを解消することができました。
RouteServiceProviderに$namespaceプロパティを設定する
・コントローラのパスを全て書く
・use を使ってコントローラのパスを読み込む

RouteServiceProviderに$namespaceプロパティを設定する

このようにRouteServiceProviderに$namespaceを追加して、対象のルーティングに適用してやります。
すると今までと同じようにaction('HelloController@index')という書き方でaction()を使うことができます。

RouteServiceProvider.php
class RouteServiceProvider extends ServiceProvider
{
+    protected $namespace = 'App\Http\Controllers';

        (中略)

     public function boot()
    {
        $this->configureRateLimiting();

        Route::middleware('web')
+           ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));
        });
    }
index.blade.php
<p>{{ action('HelloController@index') }}</p>

コントローラのパスを全て書く

Laravelのバージョンアップによって、コントローラの名前空間のプレフィックスが自動でつかなくなったことが原因でエラーが出ていたので、下のように手動でつけてやってもうまくいきます。

index.blade.php
<p>{{ action('App\Http\Controllers\HelloController@index') }}</p>

use を使ってコントローラのパスを読み込む

この方法も基本的には2番目と同じ方法ですが、@phpを使いuseでコントローラを指定しています。
action()の中身は、[HelloController::class, 'index']というようにweb.appと同じ書き方で書くことができます。

index.blade.php
@php
    use App\Http\Controllers\HelloController;
@endphp
<p>{{ action([HelloController::class, 'index']) }}</p>

参考

Laravel 8.x アップグレードガイド

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?