前回の記事でLaravelに関しては6.xを使い続けている点に関して触れましたが、今週になってとある理由でより新しいバージョンを使いたくなりました。
これも前の記事で触れたように、9のリリースが来年1月に延期されているため、現状の選択肢としては8.xを使うしかないと言うことになります。
と言うことで、早速8.xを使ってみましたが、いきなりルーティングでハマったので、その辺に関して書きたいと思います。
発生した問題
まず、6.xの常識に則って普通にコントローラを作成し、ルーティングします。
コントローラ「app/Http/Controllers/Sample/Test1Controller.php」は以下の内容です。
<?php
namespace App\Http\Controllers\Sample;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class Test1Controller extends Controller
{
public function __invoke()
{
// 必要な処理
}
}
最低限の内容です。
ルーティング「routes/api.php」は以下のようにします。
Route::namespace('Sample')->prefix('sample')->name('sample.')->group(function () {
Route::get('test1', 'Test1Controller')->name('test1');
});
こちらもごく基本的な設定内容です。
で、実行すると、
UnexpectedValueException: Invalid route action: [Sample\Test1Controller]
と怒られます。
原因
本件は8.x以降(つまりは7.xまでは従来通り)の仕様らしいですが、もともと7.x以前でルーティング時にコントローラのパスを指定しなくても良かったのは「app/Providers/RouteServiceProvider.php」内で以下のような定義が行われていたことによります。
/**
* This namespace is applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
コントローラの名前空間としては無条件に「App\Http\Controllers」を追加して解釈されるようになっていた訳です。
一方で、8.xでは以下のように変更されています。
/**
* The controller namespace for the application.
*
* When present, controller route declarations will automatically be prefixed with this namespace.
*
* @var string|null
*/
// protected $namespace = 'App\\Http\\Controllers';
機能自体は存在しますがコメントアウトされています。
では、8.xではどのようにルーティングを行うべきかと言うと、基本的には以下のように書くことになっている模様です。
use App\Http\Controllers\Sample\Test1Controller;
Route::namespace('Sample')->prefix('sample')->name('sample.')->group(function () {
Route::get('test1', Test1Controller::class)->name('test1');
});
ただ、先に示したように8.xの「app/Providers/RouteServiceProvider.php」でも自動的に名前空間を補完する仕組み自体は存在するので、このコメントアウトを外して、当該処理を有効にすれば従来の指定方法でも問題なく動作するようになります。
総括
それなりに理由はあるのでしょうが、7.x以前の書き方の方がシンプルで良かったと思うのは私だけでしょうか?
まぁ、「app/Providers/RouteServiceProvider.php」内のコメントアウトを一箇所修正すれば良いだけであれば、個人的には今後もそのようにして従来の書式を使い続けるだろうと思います。
来年早々に出ると言われている9ではどうなっているでしょうかね。
さて、本投稿が今年最後の投稿になるかと思います。
本年は個人および弊社の技術力向上を祈念した願掛けもどきの作業として年初(1月3日)からの毎週投稿を心がけてきました。
途中、諸般の事情により3回ほど投稿できなかった週がありますので満願成就とはいかないかもしれませんが、飽きっぽい自分としてはまぁまぁ頑張った方なので、神様も大目に見てくれるのではないかと期待しています。
今年は私的には色々とあった年でしたし、世間はいまだにコロナに振り回されているような状況ですが、来年こそは良い年になって欲しいものだと思います。
では、みなさま、どうぞ良いお年をお迎えください。