xinningsu/laravel-route-trailing-slash

让 Laravel 路由工作得与我们定义的完全一样,包括尾部斜杠。

V1.0.1 2021-01-16 06:06 UTC

This package is auto-updated.

Last update: 2024-09-18 20:23:09 UTC


README

让 Laravel 路由工作得与我们定义的完全一样,包括尾部斜杠。

MIT licensed Build Status Coverage Status Scrutinizer Code Quality Code Intelligence Status Quality Gate Status Reliability Rating Security Rating Maintainability

背景

目前当我们定义一个路由时,Laravel 将删除所有的尾部斜杠,输出不带任何尾部斜杠的路由 URL。当我们访问带有尾部斜杠的 URL 时,Laravel 也会删除它们。这使得尾部斜杠没有意义,有时相当令人烦恼。

定义路由如下

use App\Http\Controllers\PartnersController;

Route::get('/partners/', [PartnersController::class, 'index'])->name('partners');

输出路由 URL

echo route('partners');

当前行为

https://laravel.net.cn/partners

预期行为

https://laravel.net.cn/partners/

分页渲染

使用数据库查询构建器或 LengthAwarePaginator/Paginator

当前行为

https://laravel.net.cn/partners?page=2

预期行为

https://laravel.net.cn/partners/?page=2

安装

composer require xinningsu/laravel-route-trailing-slash

有两个服务提供者,因为路由服务提供者必须在 Laravel HTTP 内核类实例化之前注册,所以我不能通过 Laravel 包自动发现功能使其工作。必须手动添加。

RoutingServiceProvider

bootstrap/app.php 中打开,在实例化 app 之后

$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

添加

$app->register(Sulao\LRTS\Routing\RoutingServiceProvider::class);

PaginationServiceProvider

Pagination 服务提供者必须添加到 之后 Laravel 原始 Pagination 服务提供者。

Sulao\LRTS\Pagination\PaginationServiceProvider::class 添加到 config/app.php 下的 providers 元素,之后 Illuminate\Pagination\PaginationServiceProvider::class

[
    Illuminate\Pagination\PaginationServiceProvider::class,
    
    // ...
    
    /*
    * Package Service Providers...
    */
    Sulao\LRTS\Pagination\PaginationServiceProvider::class,

   // ...
];
        

这就完成了,现在我们可以生成带有/不带尾部斜杠的 URL,与路由的定义相同。

不匹配行为

目前 Laravel 将删除访问 URL 的尾部斜杠,所以无论 URL 有多少尾部斜杠,都没有区别。

当前行为

现在我们可以自定义不匹配行为,例如如果路由不匹配只是因为尾部斜杠,则中止 404 或 301/302 重定向。

404 行为

app/Providers/AppServiceProvider.php 中打开,将以下行添加到 register 方法中

\Sulao\LRTS\Routing\Router::$mismatchAction = 404;

现在行为变为

301/302 行为

app/Providers/AppServiceProvider.php 中打开,将以下行添加到 register 方法中

\Sulao\LRTS\Routing\Router::$mismatchAction = 301;

现在行为变为

许可证

MIT