Laravel 8:POST 请求被视为 GET

时间:2021-05-11 15:44:57

标签: laravel laravel-8 laravel-routing

我有两条接受可选参数的路由:

Route::get('application/cedula/{cedula}/{view?}/{model?}', 'App\Http\Controllers\ApplicationController@getCedulaInformationFromPublicServices')->name('application.cedula');
Route::post('application/cedula/{cedula}/verification/{code?}', 'App\Http\Controllers\ApplicationController@verifyApplicationCode')->name('application.confirm');

public function verifyApplicationCode( Request $request, String $cedula, String $code = NULL ) {...}
public function getCedulaInformationFromPublicServices( String $cedula, String $view = NULL, String $model = NULL){...}

当我向 application/cedula/0001001010/verification 发出 POST 请求时,没有可选参数 "{code?}",它进入 GET 路由。

我知道它正在将 "verification" 作为可选参数 {view?} 传递给 GET 端点,但是请求类型不应该足以区分尽管端点名称相似,但要遵循哪个。

2 个答案:

答案 0 :(得分:0)

“尽管端点名称相似,但请求类型不应该足以区分要遵循哪一个”?是的,这就够了。问题不在于您的代码。甚至我也是这样:

Route::get('application/cedula/{cedula}/{view?}/{model?}', 'App\Http\Controllers\ApplicationController@getCedulaInformationFromPublicServices')->name('application.cedula');
Route::post('application/cedula/{cedula}/{view?}/{model?}', 'App\Http\Controllers\ApplicationController@verifyApplicationCode')->name('application.confirm');

不可能有问题。当存在多个这样的潜在匹配时,就会出现问题:

Route::post('application/cedula/{cedula}/{view?}/{model?}', ...);
Route::post('application/cedula/{cedula}/verification/{code?}', ...);

现在,如果您向 POST 发出 application/cedula/0001001010/verification/model1 请求,第一个路由将首先出现,因此它将被选中。这是因为在访问路由时,Laravel 会从上到下遍历你的路由,直到找到第一个匹配项,此时会立即选择该路由。

但在您的情况下不会有问题,因为您的路由具有不同的请求类型。尝试使用 php artisan route:list 检查它们是否被缓存。如果没有,问题在于您测试它们的方式。我会推荐像 Postman 这样的东西。

答案 1 :(得分:-1)

尝试重新安排您的路线,将路径固定的路线放在首位

Route::post('application/cedula/{cedula}/verification/{code?}', 'App\Http\Controllers\ApplicationController@verifyApplicationCode')->name('application.confirm');
Route::get('application/cedula/{cedula}/{view?}/{model?}', 'App\Http\Controllers\ApplicationController@getCedulaInformationFromPublicServices')->name('application.cedula');

不要忘记运行:php artisan route:clear