Laravelでトレイリングスラッシュを使う方法

Laravelでは、URLの末尾に/(スラッシュ)が付くとスラッシュなしにリダイレクトされるようになっており、リンクとして生成されるURLも末尾にスラッシュがないものとなります。
URLの最後をスラッシュで終わらせたいケースもあると思いますので、トレイリングスラッシュの設定方法についてご紹介します。

まずは、公開ディレクトリとなるpublic内の.htaccessを書き換えます。
public/.htaccessのRedirect Trailing Slashes If Not A Folder…部分をコメントアウトすることで、末尾スラッシュなしのURLにリダイレクトされるのを止めます。

次にLaravelが生成するURLの末尾にスラッシュを付けるためUrlGeneratorのformatメソッドを上書きすることで、末尾にスラッシュを付けたURLで運用することができるようになります。
app/Services/Routeディレクトリを作成し、UrlGeneratorを配置します。

<?php
namespace App\Services\Route;

use Illuminate\Routing\UrlGenerator as BaseUrlGenerator;

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

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

        $mathes = null;
        preg_match("/([^\/]+?)?$/", $path, $mathes);
        $last = $mathes[0] ?? '';

        if (strpos($last, ".") === false) {
            return $path."/";
        }
        return $path;
    }
}
?>

作成したUrlGeneratorをAppServiceProviderに登録します。
app/Providers/AppServiceProvider.phpのregisterにUrlGeneratorを登録する記述は以下の通りです。

    public function register()
    {
        $url = $this->app['url'];
        $this->app->singleton('url', function () use ($url) {
            return new \App\Services\Route\UrlGenerator($url);
        });
    }

Laravelでトレイリングスラッシュを使う方法にコメントする

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