如果我的web.php中有两条路由A和B。我该如何进行中间件检查:
if (something in my database have status == 0) {
return $next($request); ROUTE A
} else {
return $next($request); ROUTE B
}
我提到return $next($request);
是因为其中有一个条件,我不希望同时访问这两个路由。例如,如果我去url/routeA
,如果满足条件,则允许不显示路线B。路线B也是如此。
逻辑就像该用户从列表中选择一个项目(在数据库中,列表表示为:list
和id,name,status
),如果状态为0,则显示路线A;如果状态为,则显示路线A。 1显示路线B。如果我尝试访问url/routeB?listID1
,请直接检查条件(对于id1
)并显示路线A或B。
状态仅0或1。如果状态为1,则所有用户将直接访问routeB,如果状态为0,则到达该位置的第一个用户将访问routeA进行某些操作(将状态设置为1),将其重定向到routeB。他之后的下一个用户将直接到达routeB
答案 0 :(得分:4)
您可以使用路由名称,而只需在任何地方使用它即可。
//define route
Route::get('/A', 'ControllerA@methodA')->name('A');
Route::get('/B', 'ControllerB@methodB')->name('B');
在您的控制器中,只需使用路由名称
$routeName = ['A','B']; //route name
If (something in my database have status == 0) {
return Redirect::route($routeName[0]); //ROUTE A
} else {
return Redirect::route($routeName[1]); //ROUTE B
}
否则,您可以执行一些操作来获取路由组参数
Route::group(['prefix' => '/test/{id}'], function() {
//you can't access parameter directly here
$id = explode('test/',url()->current())[1]; //get parameter with different way
if($id == 1){
exit('do something');
}else{
exit('do others');
}
});
答案 1 :(得分:2)
如果需要,您可以从中间件进行重定向:
constructor(private router: Router) { }
public submitSurvey(): void {
// Make sure everything is answered
const allOKClientSide: boolean = this.surveyService.checkEntireForm(this.thisSurvey);
if (allOKClientSide) {
if (this.surveyService.checkFormOnline(this.thisSurvey).subscribe()) {
this.router.navigateByUrl('/placeOne');
return;
}
}
this.router.navigateByUrl('/placeTwo');
}
只需确保在if (something in my database have status == 0) {
return redirect()->route('route_a_name');
} else {
return redirect()->route('route_b_name');
}
中命名路线即可。
示例:
routes/web.php
修改:
根据您提供的其他信息,您想要实现的中间件似乎是最重要的。相反,您可以只使用一条路由并传入status参数。有关路由参数的更多信息,请参见https://laravel.com/docs/5.6/routing#route-parameters。
示例:
Route::get('/route_a', 'YourController@RouteA')->name('route_a_name');
然后在您的控制器中,根据状态处理逻辑:
Route::get('/your_route/{status}', 'YourController@ControllerAction');