この記事は?
Laravelのルーティングはweb.phpを使うのが一般的ですが、LaravelCollective/annotationsを使うことでflaskやSpring Bootのようにメソッドにアノテーションをつけてルーティングさせることが可能なので試してみました。
この記事はアノテーションでのルーティングを行うことのメリットとその方法についてまとめます。
アノテーションでルーティングするメリット
web.phpを使用したルーティングは1ファイルでルーティングを管理することから一覧性があって見やすい反面、複数人で開発を行おうとしたときにweb.phpがコンフリクトする確率が高くなってしまいます。
アノテーションを使用してルーティングを記載するファイルが分かれることで、コンフリクトが減らすことができます。
アノテーションでルーティングする方法
前提
この記事ではLaravelでのプロジェクト作成ができることと何らかの方法でデプロイする方法を持っていることを前提としています。
Laravelプロジェクトの作成
Laravelプロジェクトの作成コマンド
composer create-project laravel/laravel sample_laravel_annotation
デプロイしてみてwelcome画面が表示されるか確認してみます。
下記のようにwelcome画面が表示されればプロジェクトの作成には成功しています。
Laravel Collective をインストール
Laravel Collective をインストールコマンド
cd sample_laravel_annotation
composer require laravelcollective/annotations
Service Providerの作成
Service Providerの作成コマンド
php artisan make:provider AnnotationsServiceProvider
上記のコマンドを実行したらapp/Providers/AnnotationsServiceProvider.php
が作成されます。
Service Providerの編集
作成されたService Providerをもとに下記の通り編集を行います。
<?php
namespace App\Providers;
use Collective\Annotations\AnnotationsServiceProvider as ServiceProvider;
class AnnotationsServiceProvider extends ServiceProvider {
/**
* The classes to scan for event annotations.
*
* @var array
*/
protected $scanEvents = [];
/**
* The classes to scan for route annotations.
*
* @var array
*/
protected $scanRoutes = [];
/**
* The classes to scan for model annotations.
*
* @var array
*/
protected $scanModels = [];
/**
* Determines if we will auto-scan in the local environment.
*
* @var bool
*/
protected $scanWhenLocal = true;
/**
* Determines whether or not to automatically scan the controllers
* directory (App\Http\Controllers) for routes
*
* @var bool
*/
protected $scanControllers = true;
/**
* Determines whether or not to automatically scan all namespaced
* classes for event, route, and model annotations.
*
* @var bool
*/
protected $scanEverything = true;
}
Service Providerの登録
追加したService Providerをconfig/app.php
内に記載します。
(中略)
'providers' => [
(中略)
App\Providers\AnnotationsServiceProvider::class,
],
(中略)
Controllerの作成
ここまでで準備は整っているので実際にアノテーションをつけるControllerを作成します。
せっかくなので複数のControllerを作ってルーティングできるようにします。
作成コマンド
php artisan make:controller HogeController
php artisan make:controller FugaController
上記を実行するとapp/Http/Controllers/HogeController.php
とapp/Http/Controllers/FugaController.php
が作成されます。
HogeControllerの編集内容
HogeControllerを下記の通りアノテーションを使って編集します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HogeController extends Controller
{
/**
* @Get("/hoge")
*/
public function index()
{
return 'hoge';
}
}
FugaControllerの編集内容
FugaControllerを下記の通りアノテーションを使って編集します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FugaController extends Controller
{
/**
* @Get("/fuga")
*/
public function index()
{
return 'fuga';
}
}
これで準備ができたのでそれぞれの画面に遷移してみようと思います。
/hogeに遷移
/fugaに遷移
無事にアノテーションを使用したルーティングを行うことができました。
終わりに
この記事ではアノテーションを使ったルーティングを行うことをメインに話しているのでデメリットには触れていませんでしたが、コメントアウトの部分にアノテーションがあることはこの記法を知らない人からしてみると直感的ではないのでこのことが起因したバグが起きたりするのではないかなとも思いました。
使うか使わないかはプロジェクトメンバーのスキルセットや人数をよく考えた上で決めたほうが良いのだろうなと思います。
今回使用したコードのサンプルは以下に配置します。
https://github.com/KiharaTakahiro/sample_laravel_annotation