Laravel / PHP / Programming

Laravelのルーティング(Routing)を知りたい

こちらの内容はLaravel公式のリファレンスをかなり参考にしています

ルーティングって日本語的に何?

Routing
名詞
・何かの移動や設置のために特定の経路や方角を使用すること
・コンピューターネットワーク間で情報を送信するプロセス(過程)

参照するサイトによってばらつきはあると思いますが、概ねこのような内容だと思います
むりやり訳すとしたら「誘導」とか。。。ですかね??

以下では、ルーティングの設定方法を解説し、最後にルーティングが何たるかの個人的考えを提案しています
※あくまで提案です笑

コードから感じる

まずはLaravelプロジェクト作成時に自動で作成されるルーティングを見てみます

routes\web.php

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

getメソッドの第一引数にパス、第二引数にクロージャーを指定することでルーティングを制御しており、上記の場合、「http://localhost:8000/」が指定されるとview(‘welcome’)が実行されます
view(‘welcome’)は「app\resources\views」にある「welcome.blade.php」を指します

これをまねして自作のルーティングを作ります
まずはルーティング先(目的地)のファイルを作るため、「app\resources\views」に「適当な名前+.blade.php」を作成します
下記をコピーし、作成したファイルにペーストします

resources\views\home.blade.php

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Home</title>
    </head>
    <body>
        <div>
            HOME
        </div>
    </body>
</html>

最後に「web.php」に下記の9行目以降を加え、「http://localhost:8000/適当な名前」にアクセスすると、真っ白画面にHOMEとだけ表示されるはずです

routes\web.php

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::get('/home', function () {
    return view('home');
});

ルーティングの基礎

すべてのLaravelのルートはroutesディレクトリにあるrouteファイルに定義されています
このファイルは「bootstrap\app.php」に定義されている設定内容をもとに自動的に読み込まれます

と公式に記載があるため見てみます
プロジェクト作成時の「bootstrap\app.php」は下記のとおりです

bootstrap\app.php

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

9行目で「routes/web.php」がwebとして設定されているため、「http://localhost:8000/」にアクセスすると「routes/web.php」が読み込まれます
下記セクションで解説しているAPIの場合、apiとして設定したphpファイルは「http://localhost:8000/api/パス」で読み込まれます

このように「bootstrap\app.php」に設定されたphpファイルをLaravelが自動で読み取り、そこに定義されているルートを表示しています

APIのルーティング設定

APIのルーティングを設定するには下記のArtisanコマンドを実行します

php artisan install:api

このコマンドでLaravel Sanctumのインストール、「bootstrap\app.php」へのapi記述の追加、「routes\api.php」の作成が行われます

Laravel Sanctumとは強固でシンプルなAPIトークン認証機能を提供するものであり、SPA(シングルページアプリケーション)・モバイルアプリ・第三者のAPI使用の認証に使用します

「bootstrap\app.php」に追加されるapi記述は下記の10行目です

bootstrap\app.php

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php', // 追加行
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

10行目に追加された内容は、apiの場合は「routes\api.php」を参照することを表しています
追加された「routes\api.php」は下記のとおりです

routes\api.php

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:sanctum');

「bootstrap\app.php」でapiに指定されたURLには、自動的にパスの最初に「\api」が設定されます
これを変更する場合は、下記のように「bootstrap\app.php」にapiPrefixを指定します

...
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
        apiPrefix: '任意の文字列/', // 追加行
    )
...

このままではgetしようとしてもunauthenticated表示がされ、うまくできません
それについてはまた今度にしようと思います🙇‍♂️


ルーティングとは、指定されたパスとメソッドから、特定の処理や表示を行うことのようです
Laravelのルーティングの流れは下記の通りとなっており、どれが欠けてもうまく機能しません
「bootstrap\app.php → routes/XXX.php → 適切なphp」

ご質問等あればお気軽にコメントまでお願いいたします

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です