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の最後にスラッシュが着いていれば設定完了です。