Laravelで /(トレイリング スラッシュ)がついているURLを扱うには


やりたいこと

Laravelの標準ではURLのトレイリングスラッシュが削除されてしまうため、
削除されていないURLを取得・生成したい。

環境

Laravel 8.35.1
PHP 7.4.19

トレリングスラッシュがついたURLを取得する

Illuminate\Http\Requestクラスをオーバーライドする

app/Services/Vendor/Http/Request.php
use Illuminate\Http\Request as BaseRequest;

class Request extends BaseRequest
{
    /**
     * Get the URL (no query string) for the request.
     *
     * @return string
     */
    public function url()
    {
        return preg_replace('/\?.*/', '', $this->getUri());
    }
}

Requestクラスを上のオーバーライドしたクラスに置き換える

public/index.php
// use Illuminate\Http\Request;
use App\Services\Vendor\Http\Request;

トレイリングスラッシュがついたURLが取得出来る

$request->fullUrl(); // http://localhost/api/works/

トレイリングスラッシュがついたURLを生成する

Illuminate\Routing\UrlGeneratorクラスをオーバーライドする

app/Services/Vendor/Route/UrlGenerator.php
use Illuminate\Routing\UrlGenerator as BaseUrlGenerator;

class UrlGenerator extends BaseUrlGenerator
{
    /**
     * Create a new manager instance.
     *
     * @param BaseUrlGenerator $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
     * @param 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;
    }
}

上のクラスを登録する

app/Providers/AppServiceProvider.php
    public function boot()
    {
        $url = $this->app['url'];
        $this->app->singleton('url', function () use ($url) {
            return new UrlGenerator($url);
        });
    }

トレイリングスラッシュがついたURLが生成出来る

route('api.works.index') // http://localhost/api/works/

以上

参考

https://readouble.com/laravel/4.2/ja/extending.html
https://qiita.com/watanuki_p/items/ce123404b569214ecff2