问题
您正试图通过其名称重定向到一个路由,但您将一个 URL 传递给该方法。
return redirect() # Initialize a redirect...
->route(...); # to a route by it's name
解决方案
有多种方法可以解决这个问题。您可以通过路径重定向(即
您目前正在尝试如何做),或者使用路线名称。
方法一:按路径重定向
您可以通过两种方式通过路径重定向:
- 手动连接路径
- 使用 URL 门面。
手动连接路径
$url = '/orders/view/' . $order->id;
return redirect($url);
使用 URL 门面
# Remember to remove the trailing slash.
# Appending a trailing slash would lead to example.com/orders/view//1
$url = URL::to('/orders/view', [$order->id]);
return redirect($url);
你已经完成了!
方法二:通过路由名重定向
要使用路线名称,您需要准备路线并为其命名。
我推荐这种方式,因为有时它更清楚,但它也使
当您需要更改某些路径时,可以更轻松地维护您的应用程序,因为
名字还是一样的。在此处阅读更多信息:
https://laravel.com/docs/5.2/routing#named-routes
这还允许您使用易于使用且有用的route() 辅助方法。
准备您的路线文件
要为您的路由命名,您需要将它们传递给您的路由器 app/Http/routes.php。
# Example 1
Route::get('/orders/view/{id}', [
'as' => 'orders.view', 'uses' => 'OrderController@view'
]);
# Example 2
Route::get('/orders/view/{id}', 'OrderController@view')->name('orders.view');
对于我自己,我建议使用第二种语法。它使你的代码更
可读。
按路由名称重定向
现在是重定向的时候了!如果你使用路由命名的方法,你不会
甚至必须对您的代码进行大量更改。
return redirect()->route('orders.view', ['id' => $order->id]);
我身边的一封信
查看文档中的 route-model-binding:
https://laravel.com/docs/5.2/routing#route-model-binding
这允许您将模型实例直接传递给route() 方法和
它通过将正确的模型传递给控制器方法来帮助您获取模型
像这样:
# Generate route URL
route('orders.view', $order);
# Controller
public function view(Order $order) {
return $order;
}
在您的app/Http/routes.php 中,您将使用{order} 而不是{id}:
Route::get('/orders/view/{order}', 'OrderController@view');