我正在與可以驗證狀態(驗證電??子郵件)的用戶一起開發 laravel 專案。
另一方面,用戶可以擁有由“訂閱”中間件驗證的訂閱。
所以我有幾組路由,包括 2 組,其中唯一的區別是訂閱與否
第 1 組:
Route::group(['middleware' => ["auth:sanctum", "verified"]], function () {}
第 2 組
Route::group(['middleware' => ["auth:sanctum", "verified", "subscriptions"]], function () {}
我的問題是關于 laravel 用于這些組中路由的順序。例如如果用戶滿足第一組的所有中間件,laravel 會測驗第二組的中間件嗎?驗證的用戶是否有機會進入第二組訂閱路線?
反之,如果用戶沒有訂閱,則不會通過訂閱中間件。但我的印象是用戶被訂閱中間件重定向,該中間件失敗,而 laravel 可以在沒有此中間件的情況下在組中找到正確的路由(組 1)
我想要的是它只是測驗訂閱的存在,如果沒有找到,它會在 group1 中查找路由。
代碼中組的順序對處理有影響嗎?
謝謝。
編輯:
Route::group(['middleware' => ["auth:sanctum", "verified", ]], function () {
Route::get("/new", function () {
// redirect to payment
})->name("new-payment");
}
Route::group(['middleware' => ["auth:sanctum", "verified", "subscriptions"]], function () {
Route::get("/new", function () {
return view("bourse-new");
})->name("new-abo");
它是相同的路線,但根據訂閱的存在與否而具有不同的行為當訂閱中間件失敗時,它會重定向到“home”,但我希望 laravel 使用第一條路線
uj5u.com熱心網友回復:
我的問題是關于 laravel 用于這些組中路由的順序。例如如果用戶滿足第一組的所有中間件,laravel 會測驗第二組的中間件嗎?
如果您遇到第一組中包含的路線,laravel 將不會檢查另一組。
驗證的用戶是否有機會進入第二組訂閱路線?
如果他沒有訂閱他不能
代碼中組的順序對處理有影響嗎?
是的,如果您使用相同的 uri,最后一個將覆寫前一個
Route::group(['middleware' => ["auth:sanctum", "verified", ]], function () {
Route::get("/new", function () {
// redirect to payment
})->name("new-payment");
}
Route::group(['middleware' => ["auth:sanctum", "verified", "subscriptions"]], function () {
Route::get("/new", function () {
return view("bourse-new");
})->name("new-abo");
嘗試 php artisan route:list,第二組可能會覆寫第一組
好的,謝謝,但我想要不同的行為,具體取決于訂閱的存在與否
在用戶模型中:
public function hasSubscribed()
{
//do your logic to check if has subscription
}
您可以使用第一個組并檢查 Auth::user() 是否已訂閱。像這樣:
if (auth()->user()->hasSubscribed()) {
return view()
}
//or ...
uj5u.com熱心網友回復:
在 app/Http/Kernel.php
protected $middlewarePriority = [
\Illuminate\Cookie\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class,
\Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
檔案:https : //laravel.com/docs/8.x/middleware#sorting-middleware
uj5u.com熱心網友回復:
感謝@NoobDev。
我通過將訂閱測驗集成到中間件中來接管他的解決方案
Route::group(['middleware' => ["auth:sanctum", "verified", function () {
Route::get("/new", function () {
return view("bourse-new");
})->middleware("subscriptions")->name("bourse-new");
}
和訂閱中間件:
public function handle(Request $request, Closure $next){
if( //logic tests) {
return $next($request);
}
return redirect('/checkout'); //redirect to payment
}
這個解決方案幾乎完美,謝謝大家
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376340.html
