LaravelでURLの末尾にスラッシュを付ける

LaravelはURLの末尾にスラッシュ(/)をつけてもつけなくても同様に表示されますが、

常にスラッシュが表示されるように設定してみました。

.htaccessで設定する方法もあるようですがLaravelの設定のみで行います。

ちなみに末尾のスラッシュはトレイリングスラッシュ(trailing slash)と言うようです。


環境

Laravel 9.19


UrlGeneratorのオーバーライド

Illuminate\Routing\UrlGenerator.phpのformatメソッドをオーバーライドする必要があるため、新しいクラスを作成します。

app/Routing/CustomUrlGenerator.php

<?php
 namespace App\Routing;

 use Illuminate\Routing\UrlGenerator;

 class CustomUrlGenerator extends UrlGenerator
 {
   /**
    * Create a new manager instance.
   *
    * @param UrlGenerator $url
   */
   public function __construct(UrlGenerator $url)
   {
    parent::__construct($url->routes, $url->request);
   }

   /**
    * Format the given URL segments into a single URL.
    *
    * @param string $root
    * @param string $path
    * @param \Illuminate\Routing\Route|null $route
    * @return string
    */
   public function format($root, $path, $route = null)
   {
    $path = parent::format($root, $path);

    $mathes = null;
    preg_match("/([^\/]+?)?$/", $path, $mathes);
    $last = $mathes[0] ?? '';
    if (strpos($last, ".") === false) {
     return $path . "/";
    }   return $path;
   }
}

AppServiceProviderへの登録

app/Providers/AppServiceProvider.phpに作成したCustomUrlGeneratorを追加します。
赤字が追加部分です。

use App\Routing\CustomUrlGenerator;

class AppServiceProvider extends ServiceProvider
{
 /**
  * Bootstrap any application services.
  *
  * @return void
  */
 public function boot()
 {
   $url = $this->app['url'];
   $this->app->singleton('url', function () use ($url) {
    return new CustomUrlGenerator($url);
   });

 }
}

ブラウザで画面を開いた際にURLの最後にスラッシュが着いていれば設定完了です。