Help us understand the problem. What is going on with this article?

【Laravel】Routingの書き方のおすすめは?

More than 1 year has passed since last update.

この記事の意図

LaravelのRoutingはなかなか自由に書くことができます。なので一旦どう書くといいんだ?
的なことが僕には怒っています(いえ、起こっています)なので個人的におすすめを披露。

RoutingのBestを探すメリット

  • 探しやすい
  • 可読性があがることで管理しやすくなる
  • セキュリティー面で確認しやすい

RoutingのBestを探すデメリット

  • たぶんないのでレッツBest
  • つかれるのかも

結論

いろんなパターンを書くのが面倒なのでいきなり結論。
結論についてだけ解説します。

まず、著者の著書を紹介するサイトだと想定してください。
なので著者は著書を大量に持っています。

web.php
<?php

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Auth::routes(['verify' => true]);
// ダッシュボード
Route::get('/', 'HomeController@index')->name('home');
// 著者ページ
Route::resource('authors', 'AuthorController');
// 著者配下
Route::prefix('authors/{author}')->name('authors.')->group(function () {
    // 著者アカウントページ
    Route::prefix('accounts')->name('profile.')->group(function () {
        Route::get('email', 'AuthorAccountController@email')->name('email');
        Route::put('email', 'AuthorAccountController@updateEmail')->name('email.update');
        Route::get('password', 'AuthorAccountController@password')->name('password');
        Route::put('password', 'AuthorAccountController@updatePassword')->name('password.update');
    });
    // 著書ページ
    Route::resource('books', 'BookController');
});


middlewareは面倒ですがControllerに記載

AuthorController
<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Http\Requests\Authors\UpdateRequest;
use App\Models\Author;

class AuthorController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(['auth', 'verified']);
    }
}

php artisan route:list で見るとこんな感じ

+--------+-----------+------------------------------------+---------------------------------+------------------------------------------------------------------------+-------------------------------------------------+
| Domain | Method    | URI                                | Name                            | Action                                                                 | Middleware                                      |
+--------+-----------+------------------------------------+---------------------------------+------------------------------------------------------------------------+-------------------------------------------------+
|        | GET|HEAD  | /                                  | home                            | App\Http\Controllers\HomeController@index                              | web,auth,verified                               |
|        | GET|HEAD  | _ignition/assets                   |                                 | Facade\Ignition\Http\Controllers\IgnitionAssetsController              | Facade\Ignition\Http\Middleware\IgnitionEnabled |
|        | POST      | _ignition/execute-solution         |                                 | Facade\Ignition\Http\Controllers\ExecuteSolutionController             | Facade\Ignition\Http\Middleware\IgnitionEnabled |
|        | GET|HEAD  | _ignition/health-check             |                                 | Facade\Ignition\Http\Controllers\HealthCheckController                 | Facade\Ignition\Http\Middleware\IgnitionEnabled |
|        | GET|HEAD  | _ignition/scripts/{script}         |                                 | Facade\Ignition\Http\Controllers\ScriptController                      | Facade\Ignition\Http\Middleware\IgnitionEnabled |
|        | POST      | _ignition/share-report             |                                 | Facade\Ignition\Http\Controllers\ShareReportController                 | Facade\Ignition\Http\Middleware\IgnitionEnabled |
|        | GET|HEAD  | _ignition/styles/{style}           |                                 | Facade\Ignition\Http\Controllers\StyleController                       | Facade\Ignition\Http\Middleware\IgnitionEnabled |
|        | POST      | authors                            | authors.store                   | App\Http\Controllers\AuthorController@store                            | web,auth,verified                               |
|        | GET|HEAD  | authors                            | authors.index                   | App\Http\Controllers\AuthorController@index                            | web,auth,verified                               |
|        | GET|HEAD  | authors/create                     | authors.create                  | App\Http\Controllers\AuthorController@create                           | web,auth,verified                               |
|        | GET|HEAD  | authors/{author}                   | authors.show                    | App\Http\Controllers\AuthorController@show                             | web,auth,verified                               |
|        | PUT|PATCH | authors/{author}                   | authors.update                  | App\Http\Controllers\AuthorController@update                           | web,auth,verified                               |
|        | DELETE    | authors/{author}                   | authors.destroy                 | App\Http\Controllers\AuthorController@destroy                          | web,auth,verified                               |
|        | PUT       | authors/{author}/accounts/email    | authors.profile.email.update    | App\Http\Controllers\AuthorAccountController@updateEmail               | web,auth,verified                               |
|        | GET|HEAD  | authors/{author}/accounts/email    | authors.profile.email           | App\Http\Controllers\AuthorAccountController@email                     | web,auth,verified                               |
|        | PUT       | authors/{author}/accounts/password | authors.profile.password.update | App\Http\Controllers\AuthorAccountController@updatePassword            | web,auth,verified                               |
|        | GET|HEAD  | authors/{author}/accounts/password | authors.profile.password        | App\Http\Controllers\AuthorAccountController@password                  | web,auth,verified                               |
|        | POST      | authors/{author}/books             | authors.books.store             | App\Http\Controllers\BookController@store                              | web,auth,verified                               |
|        | GET|HEAD  | authors/{author}/books             | authors.books.index             | App\Http\Controllers\BookController@index                              | web,auth,verified                               |
|        | GET|HEAD  | authors/{author}/books/create      | authors.books.create            | App\Http\Controllers\BookController@create                             | web,auth,verified                               |
|        | DELETE    | authors/{author}/books/{book}      | authors.books.destroy           | App\Http\Controllers\BookController@destroy                            | web,auth,verified                               |
|        | PUT|PATCH | authors/{author}/books/{book}      | authors.books.update            | App\Http\Controllers\BookController@update                             | web,auth,verified                               |
|        | GET|HEAD  | authors/{author}/books/{book}      | authors.books.show              | App\Http\Controllers\BookController@show                               | web,auth,verified                               |
|        | GET|HEAD  | authors/{author}/books/{book}/edit | authors.books.edit              | App\Http\Controllers\BookController@edit                               | web,auth,verified                               |
|        | GET|HEAD  | authors/{author}/edit              | authors.edit                    | App\Http\Controllers\AuthorController@edit                             | web,auth,verified                               |
|        | POST      | email/resend                       | verification.resend             | App\Http\Controllers\Auth\VerificationController@resend                | web,auth,throttle:6,1                           |
|        | GET|HEAD  | email/verify                       | verification.notice             | App\Http\Controllers\Auth\VerificationController@show                  | web,auth                                        |
|        | GET|HEAD  | email/verify/{id}/{hash}           | verification.verify             | App\Http\Controllers\Auth\VerificationController@verify                | web,auth,signed,throttle:6,1                    |
|        | GET|HEAD  | login                              | login                           | App\Http\Controllers\Auth\LoginController@showLoginForm                | web,guest                                       |
|        | POST      | login                              |                                 | App\Http\Controllers\Auth\LoginController@login                        | web,guest                                       |
|        | POST      | logout                             | logout                          | App\Http\Controllers\Auth\LoginController@logout                       | web                                             |
|        | POST      | password/email                     | password.email                  | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web,guest                                       |
|        | GET|HEAD  | password/reset                     | password.request                | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest                                       |
|        | POST      | password/reset                     | password.update                 | App\Http\Controllers\Auth\ResetPasswordController@reset                | web,guest                                       |
|        | GET|HEAD  | password/reset/{token}             | password.reset                  | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web,guest                                       |
|        | GET|HEAD  | register                           | register                        | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web,guest                                       |
|        | POST      | register                           |                                 | App\Http\Controllers\Auth\RegisterController@register                  | web,guest                                       |
+--------+-----------+------------------------------------+---------------------------------+------------------------------------------------------------------------+-------------------------------------------------+

何がいいか?

【No.1】MiddlewareはControllerへ

めっちゃ完結に言うと、Controllerとmiddlewareの結びつきが正しいかを判断しやすくするためです。
Routingに入れ子構造で書くと、どうしても関係性がわかりにくいし、そもそも目に入りにくいのでButと考えました。

【No.2】nameなどの表記は個別に

この辺りの話ですね。

Route::prefix('authors/{author}')->name('authors.')->

理由は明確、統合開発ツールでみやすい!!
こちらの書き方と比較

Route::get('login', [
    'as' => 'login',
    'uses' => 'Auth\LoginController@showLoginForm'
]);

具体的な値も、その要素名も全部同じ色でわかりにくい!

以上!

というわけで個人的なRouting Bestでした!
ご意見・批判・編集依頼などすべてWelcomeです笑
ではまた

KathySamurai
めちゃくちゃUXにこだわります。 やりたいことに対してなんとかするのが得意です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away