【Laravel ver.8.x】ルーティングの設定(7.xからの変更点)


Laravelの勉強を始めた。
のはいいのだが、使っている本がver6.xベースである為
最新版である8.xからだいぶ様変わりしていて絶賛混乱中。

ということで、自分のためのメモ代わりとして記録。

初学者のため、間違い等ありましたらご指摘いただけるとありがたいです。

開発環境

MacOS Catalina 10.15.7
Laravel 8.20.1
PHP 7.4.12
Apache 2.4.41
MySQL 5.7.32

作成したコントローラのルーティング

MVCに準拠した形でコントローラを作成し、そのコントローラへのルーティングを通したい。

ver8.xからルーティングの書き方に大きな変更が加わった。
なぜこんな変更をしたのかはまるで分からない。
Railsしか触ったことがないので、めんどくさくて仕方がない。

想定しているコントローラはこんな感じ

HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function index(){
    return <<< EOF
    <html>
    <head>
    <title>Hello</title>
    <style>
        body {font-size: 16px; color:#999; }
        h1 {font-size:100px; text-align:right; color:#eee; margin: -40px 0 -50px 0}
    </style>
    <body>
        <h1>Index</h1>
        <p>HelloController's sample</p>
    </body>
    </html>
    EOF;
    }
}

ver7.xまでのルーティングの書き方

web.php
//前後省略
Route::get('hello', HelloController@index);

ver8.x以降のルーティングの書き方

web.php
//前後省略
use App\Http\Controller\HelloController;
Route::get('hello', [HelloController::class, 'index']);

変更点
1. ルーティングを通すために、当該コントローラの名前空間をインポートする
2. コントローラ名@アクション名という書き方がそもそも変わった。

(20.12.29追記) シングルアクションコントローラの場合

HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //アンダースコアが2本ってのがなんとなく気に食わない
    public function __invoke(){
    return <<< EOF
    //以下略
    }
}
web.php
//前後省略

//7.xまで
Route::get('hello', HelloController);


//8.xから
use App\Http\Controller\HelloController;
//7.x同様、メソッド名の明記なし。そのため[]も不要
Route::get('hello', HelloController::class);

参考文献

Laravel公式リファレンス(再翻訳中)Laravel 8.x ルーティング
Laravel公式リファレンス(再翻訳中)Laravel 8.x コントローラ
7968様【PHP超入門】名前空間(namespace・use)について