Laravelが生成するURLの末尾にスラッシュを付ける

概要

Laravelは

foo.blade.php
<!-- 名前付きルーティング -->
<a href="{{ route('users') }}">ユーザー一覧</a>

<!-- アクション -->
<a href="{{ action('UserController@index') }}">ユーザー一覧</a>

こんな感じでリンクを生成してくれる。このリンクには末尾にスラッシュがない。
現在開発中のサービスはトップページ以外でTrailing Slashがない場合、すべてnginxでTrailing Slashを付けてリダイレクトしているので、リンク自体にTrailing Slashを付けておきたい。

実装

Illuminate\Contracts\Routing\UrlGeneratorformatメソッドをオーバーライドする。

実際のコード

元の挙動をした後に、 . がないパスにはスラッシュを付ける。
(.js や .css や .jpg などにスラッシュを付けないように)

目的の振る舞いをする format を持った UrlGenerator を好きなところに置く。

UrlGenerator.php
<?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)
    {
        $path = parent::format($root, $path);

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

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

こいつを登録すればOK.

app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $url = $this->app['url'];
        $this->app->singleton('url', function () use ($url) {
            return new \App\Services\Route\UrlGenerator($url);
        });
    }
}
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.