PHP - Laravel - ルーティング

 クラウディア
1. 概要
2. get
3. post
4. any
5. リダイレクト
6. 分割
7. 確認

1. 概要

 既に(2021年3月18日)、少し書いているかもしれないが、ルーティングのメモを・・・。  本ページは、下記のサイトを参考にさせていただきました。
Laravel のルーティングチートシート」
「【入門】Laravel の Controller について

2. 設定

 ルーティングの記述は

ドキュメントルート/routes/
 中に書いてあって。  今のところ(2021年3月18日)

ドキュメントルート/routes/web.php
 しかさわっていません。  バージョン 8.33.1 のデフォルトでは、コメントをのぞけば、前半の  [/usr/home/hogehoge/lang/php/laravel/laravel8.33.1/routes/web.php] というファイルが、なかったですじゃ・・・。  の部分と後半の  [/usr/home/hogehoge/lang/php/laravel/laravel8.33.1/routes/web.php] というファイルが、なかったですじゃ・・・。  の部分のみです。

3. post

 なるほどな、とデフォルトのを真似て、全部「get」で書いておりました。  で、リンクチェックを自作の「Python」のプログラムでやっておるのですが・・・。  いきなり、ルートの

requestLink = request.Request(URI, data='データ', headers='ヘッダ', method='POST')

html = urllib.request.urlopen(requestLink, timeout=10)
 で

HTTP Error 405: Method Not Allowed
 てなエラーになっちゃいました。  これ「post」を送っているからだそうで

Route::get('/', function () {    return view('ビュー');	});
 と同時に

Route::post('/', function () {    return view('ビュー');	});
 も書かないとエラーになっちゃうようです。

4. any

 しかし、2行ずつ書くのは面倒だなと思っていたら、下記の書き方があるようです。

Route::any('/', function () {    return view('ビュー');	});
 これだと、「get」「post」どちらも処理してくれるようです。  しかし、参考サイトに「基本使わないけど」って書いてあるのが気になりますけどね。  わたしは、逆に特定のサイトでは、「any」しかつかってません。

5. リダイレクト

 多分、こゆことしている方、そこそこいらっしゃるんじゃないかと思うのですが、「404 not found」が発生したとき、特定のページへリダイレクトするという・・・。  他のエラーでもしている方もいらっしゃるようです。  今まで、「/usr/local/etc/apache24/Includes/*.conf」に

<VirtualHost    *:80>
    ServerName          サーバ名
    DocumentRoot        /パス
    ErrorDocument       404     /リダイレクト先
</VirtualHost>
 てな書き方をするか、「.htaccess」でリダイレクト先を書くかすれば、うまくいっていたのですが、「Laravel」では、そうはいかないようです。  上記の書き方で解説しているサイトが、そこそこあるのですが、バージョン違いのためか、うまくいかない。  下記のサイトの内容で、うまくいきました。
Laravel 存在しないページにアクセスされたとき404ページではなく特定のページにリダイレクトさせる方法 – 半力投球
 すなわち

routes/web.php
 に

Route::fallback(function()
{
	return redirect('転送先');
});
 と書けば、思い通りになります。  ただし、今んとこ、転送先は、フルドメインで書く方法しか知りません。

6. 分割

 サイト内のページが、10 や 20、2桁の間はルーティングに関する情報も

routes/web.php
 1ファイルで、収まりがつきますが、4桁を超えてくると 1ファイルで書くには長すぎるし、どこに何が書いてあるんだか整理できなくなります。  そうなると、ファイルを分割してメンテナンスしていきたいと思うのは、人情です。  「Laravel」には、その方法も用意されいているのですが、どうもバージョンによって、対象方法が違うようです。  わたしが、試したのは「Laravel Framework 8.30.1」になりますが、下記のサイトの方法が適用できました。
【Laravel】route web.php 分ける - かまてく ブログ
 例えば、「routes/web.php」の内容の1部を

routes/extra.php
 に分けて書くとして。

app/Providers/RouteServiceProvider.php
 の

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });
    }
 の部分を変更します。  48行と49行との間に、下記のように書き入れるだけです。

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/extra.php'));
        });
 更に、サブディレクトリに分けることも可能で

routes/etc/extra.php
 と作成して、「app/Providers/RouteServiceProvider.php」に

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/etc/extra.php'));
        });
 と書くだけです。

7. 確認

 下記のコマンドで、ルーティングの状況を確認できます。

php /プロジェクトパス/artisan route:list
 ただし、権限の問題があって、「root」ユーザ権限でないとエラーになります。  サイトの構成によって、なんか出力内容が異なったりするのですが、一般には

+--------+----------------------------------------+-------------------+------+---------+------------+
| Domain | Method                                 | URI               | Name | Action  | Middleware |
+--------+----------------------------------------+-------------------+------+---------+------------+
|        | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | /                 |      | Closure | web        |
|        | GET|HEAD                               | api/user          |      | Closure | api        |
|        |                                        |                   |      |         | auth:api   |
|        | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | 伏字              |      | Closure | web        |
|        | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | 伏字              |      | Closure | web        |

・・・	略	・・・

|        | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | 伏字              |      | Closure | web        |
|        | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | 伏字              |      | Closure | web        |
+--------+----------------------------------------+-------------------+------+---------+------------+
 と出力されるのですが、わたしの持っているあるサイトでは、下記のように表示されました。

  ANY        / ..................................................................................................
  POST       _ignition/execute-solution ignition.executeSolution ? Spatie\LaravelIgnition ? ExecuteSolutionContr…
  GET|HEAD   _ignition/health-check ....... ignition.healthCheck ? Spatie\LaravelIgnition ? HealthCheckController
  POST       _ignition/update-config .... ignition.updateConfig ? Spatie\LaravelIgnition ? UpdateConfigController
  GET|HEAD   api/user ...........................................................................................
  ANY        伏字 ...............................................................................................
  ANY        伏字 ...............................................................................................
  GET|HEAD   sanctum/csrf-cookie .............. sanctum.csrf-cookie ? Laravel\Sanctum ? CsrfCookieController@show
  ANY        伏字 ...............................................................................................
  GET|HEAD   伏字 ...............................................................................................

                                                                                              Showing [10] routes
ハイスピードプラン