[英]Laravel route redirecting with data
我有一個看起來像這樣的基本路線:
Route::prefix('/group')->group(function () {
// Some routes here
Route::prefix('/{uuid}')->group(function () {
// Some routes here
Route::get('/user/{id}', 'Controller@preview')->name('view-user')->where('id', '[0-9]+');
}
}
邏輯是我希望id
只是數值。 我現在想做的是,如果該值是非數字的,則聲明對此的重定向。 假設id
的輸入是fs
。 在那種情況下,我希望它重定向到值為1
的id
。
我嘗試使用Route:redirect
,但無法正常工作。 它看起來像這樣:
Route::redirect('/group/{uuid}/user/{id}', '/group/{uuid}/user/1')->where('id', '[^0-9]+');
我更願意將重定向放在組內,但如果這是唯一的方法,它也可以放在組外。 任何幫助將不勝感激。
發生的事情是,如果我聲明了路由重定向,我會收到 404 錯誤。
編輯:我想在routes/web.php
文件中進行。 我知道如何在控制器中執行此操作,但在當前情況下這不是我所需要的。 閉包也不是一種選擇,因為那樣會阻止路由緩存。
你宣布它倒置了。
在 Laravel 中,您可以通過以下方式重定向傳遞的參數:
您可以傳遞名稱而不是 url 並簡單地傳遞變量。
Redirect::route('view-user', [$uuid, $id])
我認為您可以在路由器的控制器內部執行此操作,邏輯如下:
class Controller {
// previous code ..
public function preview($uuid, $id) {
if(! is_numeric($id))
return redirect("/my-url/1");
// run the code below if $id is a numeric value..
// if not, return to some url with the id = 1
}
}
我認為沒有辦法覆蓋 laravel 的“where”功能,但我想在路由綁定中有類似的東西:
或者,您可以覆蓋 Eloquent 模型上的 resolveRouteBinding 方法。 此方法將接收 URI 段的值,並應返回應注入路由的類的實例:
/**
* Retrieve the model for a bound value.
*
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveRouteBinding($value)
{
return $this->where('name', $value)->first() ?? abort(404);
}
但這要求您管理 consise 模型的值而不是您想要的任何 id。
跟進評論
您可以在 routes/web.php 文件中創建一個路由來捕獲非數字 ID,並將其重定向到 id=1 的“view-user”
它看起來像這樣
Route::get('/group/{uuid}/user/{id}', function ($uuid, $id) {
return redirect('view-user', ['uuid' => $uuid, 'id' => 1]);
})->where('id', '[^0-9]+');
// and then below have your normal route
Route::get('/group/{uuid}/user/{id}', 'Controller@preview')->name('view-user')->where('id', '[0-9]+');
在您評論說您不想使用閉包之后。
將“錯誤的輸入路徑”更改為
Route::get('/group/{uuid}/user/{id}', 'Controller@redirectBadInput')->where('id', '[^0-9]+');
然后在類Controller
中添加方法:
public function redirectBadInput ($uuid, $id) {
return redirect('view-user', ['uuid' => $uuid, 'id' => 1]);
}
您可以在此 SO 線程中看到有關重定向和緩存的更多信息。
像這樣在路線中分配路線名稱。
return Redirect::route('view-user', ['uuid'=>$uuid,'id'=>$id]);
然后在 web.php 文件中如你所願。
Route::get('/group/{uuid}/user/{id}', function($uuid, $id){
echo $uuid;
echo $id;
})->name('view-user')->where('id', '[0-9]+');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.