Laravel - 如何使用子目录左侧的参数导航到 url

Laravel - How do I navigate to a url with a parameter to left of subdirectory

我必须测试这条路线,但我不确定如何导航到它。

Route::get('/{type}/Foo/{page}/{date}', 'FooController@index');

我了解到 URLs 通常在 URL.

中的参数之前定义了子目录

我曾使用 URL 像这个例子

Route::get('/Foo/{type}', 'FooController@index');

which would have an endpoint that looks like

/Foo?type=bar

有谁知道如何测试上述路线?

好吧,我认为您需要弄清楚路由参数和查询参数之间的区别。

在您的情况下,您正在尝试使用实际上看起来像这样的路由参数:

/{type}/Foo/{page}/{date} => /myType/Foo/15/12-11-2021

Laravel 将 {} 中的单词视为可以通过请求检索的变量,因此您可以执行以下操作:

$request->type 

和 laravel 将 return 你的字符串 myType 作为输出。

在您过去尝试过的第二种情况中,您指的是查询参数,这些参数也是 $request 的一部分。将其视为 GET 请求的“正文”,但我并不是要以任何方式将您的 post 路由转换为 GET :)

第二个 url 的问题是:

/Foo/{type}/Foo?type=bar

不相似

应该是这样的:/Foo/bar

一般情况下,查询参数是您希望在 GET 端点中发送可选字段的大部分时间(用于过滤、分页等),路由参数用于导致 sub-directories 的必填字段例如 /Foo/{FooId}/Bar/{BarId}

要记住的是,你必须小心你的路由,因为变量可能会与其他路由冲突。

例如一条看起来像这样的路线:

Route::get('/foo/{fooId}', [FooController::class, 'getFoo']);
Route::get('/foo/bar', [BarController::class, 'getBar']);

会发生冲突,因为 laravel 会将 bar 视为 fooId 的变量,因此您的第二条路线永远无法访问。

解决这个问题的方法是像这样正确地排序你的路线:

Route::get('/foo/bar', [BarController::class, 'getBar']);
Route::get('/foo/{fooId}', [FooController::class, 'getFoo']);

因此,当您将 bar 以外的任何其他内容作为路由参数时,您将转到第二条路由并使其按预期工作。