Laravel 表单提交发送到错误的路由?
Laravel form submission sending to the wrong route?
我有一个非常简单的表格:
{!! Form::open(['route' => ['complete.order']]) !!}
{!! Form::hidden('date', \Carbon\Carbon::now()->format('F j, Y ')) !!}
{!! Form::hidden('web_token', $order->web_token) !!}
{!! Form::submit('Place this order', ['class'=>'btn btn-primary']) !!}
{!! Form::close() !!}
当我访问该页面时,呈现如下:
<form method="POST" action="http://site.localhost/place-order" accept-charset="UTF-8">
<input name="_token" type="hidden" value="kc6d4XoZ78RvJNtQbN8lavpLP7e1lI7rTGBvbeIP">
<input name="date" type="hidden" value="December 21, 2018 ">
<input name="id" type="hidden" value="15">
<input class="btn btn-primary" type="submit" value="Place this order">
</form>
相关路线如下:
Route::get('/orders/form', 'OrdersController@viewform')->name('orderform');
Route::post('/orders/review', 'OrdersController@review')->name('orders.review');
Route::post('/place-order', 'OrdersController@store')->name('complete.order');
Route::resource('/orders', 'OrdersController', ['except'=>['edit', 'update', 'destroy', 'show', 'store']])->middleware('auth');
Route::get('/orders/{order}', 'OrdersController@show')->name('orders.show');
当我点击提交按钮时,我被定向到 site.localhost/orders/review
,根据调试栏,它是作为 GET 请求传递的,而不是 POST。
我不明白为什么会这样。该表单应该转到 site.localhost/place-order
,目前仅输出 return('place')
用于测试。
OrdersController@show
中的代码当前输出 return('show')
。我对所有 OrdersController 方法都做了相同的测试。
添加php artisan route
输出
+--------+-----------+-------------------------------+-----------------------+------------------------------------------------------------------------+------------------------------------------------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+-------------------------------+-----------------------+------------------------------------------------------------------------+------------------------------------------------------+
| | GET|HEAD | / | | App\Http\Controllers\HomeController@index | web,auth |
| | GET|HEAD | _debugbar/assets/javascript | debugbar.assets.js | Barryvdh\Debugbar\Controllers\AssetController@js | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure |
| | GET|HEAD | _debugbar/assets/stylesheets | debugbar.assets.css | Barryvdh\Debugbar\Controllers\AssetController@css | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure |
| | DELETE | _debugbar/cache/{key}/{tags?} | debugbar.cache.delete | Barryvdh\Debugbar\Controllers\CacheController@delete | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure |
| | GET|HEAD | _debugbar/clockwork/{id} | debugbar.clockwork | Barryvdh\Debugbar\Controllers\OpenHandlerController@clockwork | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure |
| | GET|HEAD | _debugbar/open | debugbar.openhandler | Barryvdh\Debugbar\Controllers\OpenHandlerController@handle | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure |
| | GET|HEAD | api/user | | Closure | api,auth:api |
| | GET|HEAD | confirm-account/{token} | | App\Http\Controllers\UserController@create | web |
| | GET|HEAD | home | home | App\Http\Controllers\HomeController@index | web,auth |
| | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest |
| | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest |
| | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web |
| | GET|HEAD | my-account | my-account.index | App\Http\Controllers\UserController@index | web,auth |
| | POST | my-account | my-account.store | App\Http\Controllers\UserController@store | web,auth |
| | GET|HEAD | my-account/create | my-account.create | App\Http\Controllers\UserController@create | web,auth |
| | PUT|PATCH | my-account/{my_account} | my-account.update | App\Http\Controllers\UserController@update | web,auth |
| | DELETE | my-account/{my_account} | my-account.destroy | App\Http\Controllers\UserController@destroy | web,auth |
| | GET|HEAD | my-account/{my_account} | my-account.show | App\Http\Controllers\UserController@show | web,auth |
| | GET|HEAD | my-account/{my_account}/edit | my-account.edit | App\Http\Controllers\UserController@edit | web,auth |
| | POST | orders | orders.store | App\Http\Controllers\OrdersController@store | web,auth |
| | GET|HEAD | orders | orders.index | App\Http\Controllers\OrdersController@index | web,auth |
| | GET|HEAD | orders/create | orders.create | App\Http\Controllers\OrdersController@create | web,auth |
| | GET|HEAD | orders/form | orderform | App\Http\Controllers\OrdersController@viewform | web |
| | POST | orders/review | orders.review | App\Http\Controllers\OrdersController@review | web |
| | GET|HEAD | orders/{order} | orders.show | App\Http\Controllers\OrdersController@show | web |
| | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web,guest |
| | POST | password/reset | | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest |
| | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest |
| | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest |
| | POST | place-order | complete.order | App\Http\Controllers\OrdersController@store | web |
| | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest |
| | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest |
| | POST | user/store | user.store | App\Http\Controllers\UserController@store | web |
+--------+-----------+-------------------------------+-----------------------+------------------------------------------------------------------------+------------------------------------------------------+
好吧,我是个彻头彻尾的白痴。
问题是我使用自定义请求进行验证,这条路线不符合要求。所以它实际上返回了错误的页面,但由于我没有意识到这一点,所以它没有显示任何错误。
你的问题是因为你使用的是Route::resource
,这个路由定义,index
,create
,store
,show
,edit
、update
和 destroy
路由为您的控制器,您正试图覆盖 store
路由:
Route::post('/place-order', 'OrdersController@store')->name('complete.order');
您可以像这样更改表单代码:
{!! Form::open(['route' => ['orders.store']]) !!}
或者您可以在控制器中创建一个新函数:
public function newfucntion(Request $request)
{
//All your code here
}
然后创建新路由:
Route::post('/place-order', 'OrdersController@newFunction')->name('complete.order');
然后像这样更改您的表单:
{!! Form::open(['route' => ['complete.order']]) !!}
我有一个非常简单的表格:
{!! Form::open(['route' => ['complete.order']]) !!}
{!! Form::hidden('date', \Carbon\Carbon::now()->format('F j, Y ')) !!}
{!! Form::hidden('web_token', $order->web_token) !!}
{!! Form::submit('Place this order', ['class'=>'btn btn-primary']) !!}
{!! Form::close() !!}
当我访问该页面时,呈现如下:
<form method="POST" action="http://site.localhost/place-order" accept-charset="UTF-8">
<input name="_token" type="hidden" value="kc6d4XoZ78RvJNtQbN8lavpLP7e1lI7rTGBvbeIP">
<input name="date" type="hidden" value="December 21, 2018 ">
<input name="id" type="hidden" value="15">
<input class="btn btn-primary" type="submit" value="Place this order">
</form>
相关路线如下:
Route::get('/orders/form', 'OrdersController@viewform')->name('orderform');
Route::post('/orders/review', 'OrdersController@review')->name('orders.review');
Route::post('/place-order', 'OrdersController@store')->name('complete.order');
Route::resource('/orders', 'OrdersController', ['except'=>['edit', 'update', 'destroy', 'show', 'store']])->middleware('auth');
Route::get('/orders/{order}', 'OrdersController@show')->name('orders.show');
当我点击提交按钮时,我被定向到 site.localhost/orders/review
,根据调试栏,它是作为 GET 请求传递的,而不是 POST。
我不明白为什么会这样。该表单应该转到 site.localhost/place-order
,目前仅输出 return('place')
用于测试。
OrdersController@show
中的代码当前输出 return('show')
。我对所有 OrdersController 方法都做了相同的测试。
添加php artisan route
输出
+--------+-----------+-------------------------------+-----------------------+------------------------------------------------------------------------+------------------------------------------------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+-------------------------------+-----------------------+------------------------------------------------------------------------+------------------------------------------------------+
| | GET|HEAD | / | | App\Http\Controllers\HomeController@index | web,auth |
| | GET|HEAD | _debugbar/assets/javascript | debugbar.assets.js | Barryvdh\Debugbar\Controllers\AssetController@js | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure |
| | GET|HEAD | _debugbar/assets/stylesheets | debugbar.assets.css | Barryvdh\Debugbar\Controllers\AssetController@css | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure |
| | DELETE | _debugbar/cache/{key}/{tags?} | debugbar.cache.delete | Barryvdh\Debugbar\Controllers\CacheController@delete | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure |
| | GET|HEAD | _debugbar/clockwork/{id} | debugbar.clockwork | Barryvdh\Debugbar\Controllers\OpenHandlerController@clockwork | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure |
| | GET|HEAD | _debugbar/open | debugbar.openhandler | Barryvdh\Debugbar\Controllers\OpenHandlerController@handle | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure |
| | GET|HEAD | api/user | | Closure | api,auth:api |
| | GET|HEAD | confirm-account/{token} | | App\Http\Controllers\UserController@create | web |
| | GET|HEAD | home | home | App\Http\Controllers\HomeController@index | web,auth |
| | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest |
| | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest |
| | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web |
| | GET|HEAD | my-account | my-account.index | App\Http\Controllers\UserController@index | web,auth |
| | POST | my-account | my-account.store | App\Http\Controllers\UserController@store | web,auth |
| | GET|HEAD | my-account/create | my-account.create | App\Http\Controllers\UserController@create | web,auth |
| | PUT|PATCH | my-account/{my_account} | my-account.update | App\Http\Controllers\UserController@update | web,auth |
| | DELETE | my-account/{my_account} | my-account.destroy | App\Http\Controllers\UserController@destroy | web,auth |
| | GET|HEAD | my-account/{my_account} | my-account.show | App\Http\Controllers\UserController@show | web,auth |
| | GET|HEAD | my-account/{my_account}/edit | my-account.edit | App\Http\Controllers\UserController@edit | web,auth |
| | POST | orders | orders.store | App\Http\Controllers\OrdersController@store | web,auth |
| | GET|HEAD | orders | orders.index | App\Http\Controllers\OrdersController@index | web,auth |
| | GET|HEAD | orders/create | orders.create | App\Http\Controllers\OrdersController@create | web,auth |
| | GET|HEAD | orders/form | orderform | App\Http\Controllers\OrdersController@viewform | web |
| | POST | orders/review | orders.review | App\Http\Controllers\OrdersController@review | web |
| | GET|HEAD | orders/{order} | orders.show | App\Http\Controllers\OrdersController@show | web |
| | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web,guest |
| | POST | password/reset | | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest |
| | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest |
| | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest |
| | POST | place-order | complete.order | App\Http\Controllers\OrdersController@store | web |
| | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest |
| | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest |
| | POST | user/store | user.store | App\Http\Controllers\UserController@store | web |
+--------+-----------+-------------------------------+-----------------------+------------------------------------------------------------------------+------------------------------------------------------+
好吧,我是个彻头彻尾的白痴。
问题是我使用自定义请求进行验证,这条路线不符合要求。所以它实际上返回了错误的页面,但由于我没有意识到这一点,所以它没有显示任何错误。
你的问题是因为你使用的是Route::resource
,这个路由定义,index
,create
,store
,show
,edit
、update
和 destroy
路由为您的控制器,您正试图覆盖 store
路由:
Route::post('/place-order', 'OrdersController@store')->name('complete.order');
您可以像这样更改表单代码:
{!! Form::open(['route' => ['orders.store']]) !!}
或者您可以在控制器中创建一个新函数:
public function newfucntion(Request $request)
{
//All your code here
}
然后创建新路由:
Route::post('/place-order', 'OrdersController@newFunction')->name('complete.order');
然后像这样更改您的表单:
{!! Form::open(['route' => ['complete.order']]) !!}