簡體   English   中英

Laravel 路由重定向數據

[英]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 在那種情況下,我希望它重定向到值為1id

我嘗試使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM