如何从 Laravel 路由模式中排除 slug

How to exclude slugs from a Laravel route pattern

我有一个 Laravel Spark 应用程序,我想在团队和项目的路由中使用前两个参数,about_us、设置、api 等除外.

我已经设置了我的路线,类似于:

Route::pattern('team', '[a-zA-Z0-9-]+');
Route::pattern('project', '[a-zA-Z0-9-]+');

Route::get('/home', 'HomeController@show');

Route::group(['prefix' => '{team}'], function () {
    Route::get('/', 'TeamController@dashboard');
    Route::group(['prefix' => '{project}'], function () {
        Route::get('/', 'ProjectController@dashboard');
        ...

//Spark defines routes such as /settings after the apps routing file is processed;
//thus I cannot route to /settings as it's caught by /{team}.

我正在努力做两件事中的一件。或者,从 {team} 模式中排除 'api'、'settings' 等值;或者在我的网络路由之前获取到 运行 的 Laravel Spark 路由,这样我就可以确保在捕获所有 /{team}.

之前检查所有有效路由

如有任何想法,我们将不胜感激!

您应该首先定义要排除的路由。 然后在它们下面定义你的模式。它们将优先于模式,因为在 Laravel 中,路由按从上到下的顺序进行评估。

我的一个建议是考虑使用 teams 前缀,然后是团队名称,您可能会发现您想要为另一个添加更多类型的 catch-alls部分和 运行 进入更多问题。也许使用此闭包的索引列出所有 teams 对系统管理员也有好处?

如果您想继续沿着这条路走下去,请查看您的 config.app.php,我相信切换以下两个提供商可能会很好地实现您所追求的目标。最终结果顺序:

App\Providers\SparkServiceProvider::class, App\Providers\RouteServiceProvider::class,

我自己最近安装了最新版本的 Spark,这似乎是现在的默认设置,如果这是 red-herring!

,我深表歉意

我似乎已经解决了它,使用以下模式:

Route::pattern('team', '(?!^settings$)([a-zA-Z0-9-]+)');

对于刚入题的小伙伴,原则如下。在普通 Laravel 安装中,您可以 re-order 您的路由以确保它们以正确的顺序处理,在您的固定路由之后放置通配符。

使用 Spark,有许多路由都封装在 Spark 包中。不想弄乱这个,允许以后更容易升级 Spark,可以使用 route pattern 来限制参数的可接受值。因此,通过谷歌搜索 RegEx,我似乎找到了一种模式,可以排除与我的 {team} 参数匹配的 slug。

我相信添加更多排除项就像插入管道运算符一样简单。

这显然也适用于标准 Laravel 安装,但 re-order 设置你的路线可能是更好的第一次调用。