1
0

More than 1 year has passed since last update.

【laravel】ルーティングを別のファイルに定義したい!

Last updated at Posted at 2022-01-21

概要

laravelで開発を行なっている人であれば、
普段からweb.phpapi.phpなどのルーティング定義ファイルを触ったことがあるかと思います。
皆さんはルーティング定義をweb.phpに定義していますか?
それとも別のファイルに定義していますか?
この記事はweb.php以外のファイルにルーティングを定義をする為の手順をまとめたものになります。

事前知識

知らなくても実装できますが、知ってた方が良さそうなこと。

手順

  1. ルーティングを定義したいファイルを作成
  2. サービスプロバイダを作成 or 既存のサービスプロバイダを編集
  3. 作成した場合はapp.phpに登録

ルーティングを定義したいファイルの作成

test.phpというファイルを作成し、そこにルーティングを定義したいとします。

test.php
<?php

// 'test'を返却
Route::get('/example', fn () => 'test');

今の状態では、/exampleにアクセスしても404が返却されると思います。

サービスプロバイダを作成 or 編集

編集

既存のサービスプロバイダを編集します。

App\Providers\RouteServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
    // 省略

    /**
     * Define the routes for the application.
     */
    public function map(): void
    {
        $this->mapApiRoutes();

        $this->mapWebRoutes();

        // 追加したメソッドを呼び出す
        $this->mapTestRoutes();
    }

    // このメソッドを追加
    protected function mapTestRoutes(): void
    {
        // mapWebRoutes() などを参考にすればOK。
        // ミドルウェアを設定したくない場合などは省略も可
        Route::prefix('test')
            ->middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/test.php'));
    }

    // 省略
}

上記のように設定することで、routes/test.phpが読み込まれるように定義することができます。
またこのファイルで、web.phpapi.phpを読み込む設定が実装されています。

作成

作成する場合は、App\Providers\RouteServiceProvider.phpを継承したサービスプロバイダを作成します。

App\Providers\RouteRegistrarProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Route;

class RouteRegistrarProvider extends RouteServiceProvider
{
    public function map(): void
    {
        Route::prefix('test')
            ->middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/test.php'));
    }
}

コマンド補足

        Route::prefix('test')
            ->middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/test.php'));
  • prefix()でルーティングファイルにプレフィックスを設定できます。
    上記例だと、routes/test.phpに定義したルーティングに/testのプレフィックスがつくようになります。

  • namespace()でコントローラーのルートを設定できます。
    デフォルトだと、App\Http\Controllersになっていると思います。

  • group()でルーティングファイルを設定します。
    basepath()でlaravelのインストールされた場所をベースにしたパスを返却するので、引数にはlaravelのルートからルーティング定義ファイルへの相対パスを指定。

app.phpに登録(プロバイダを作成した場合)

providers 配列の中に作成したプロバイダを追加すればOK

config/app.php
    // 省略
    'providers' => [
        \App\Providers\RouteRegistrarProvider::class,
    ] 

ここまでの手順完了後に/test/exampleにアクセスすると、画面にtestと表示されると思います。(多分)

まとめ

  • 意外と簡単
  • 既存のプロバイダを編集して良いし、新たに作成しても良い
  • 新しく作成した場合は、app.phpに登録すべし

わかりにくい部分や、間違っているところなどあったら教えていただけるとありがたいです!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0