一次只能到达两条路线中的一条



如果我的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也是如此。

逻辑是这样的:如果状态为0,则用户从列表中选择一个项目(在数据库中,列表如下所示:listid,name,status(。如果状态为1,则显示路线a。如果我尝试访问url/routeB?listID1,则直接检查条件(对于id1(并显示路线a或B。

状态中只有0或1。如果状态为1,则所有用户都将直接访问routeB,如果状态为0,则第一个到达那里的用户将访问routeA执行一些操作(将状态设置为1(并重定向到routeB。他之后的下一个用户将直接到达路线B

您可以使用路由名称,只需在任何位置使用即可。

//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');
}
});

如果您愿意,您可以从中间件进行重定向:

if (something in my database have status == 0) {
return redirect()->route('route_a_name');
} else {
return redirect()->route('route_b_name');
}

只要确保在routes/web.php中命名您的路线即可。

示例:

Route::get('/route_a', 'YourController@RouteA')->name('route_a_name');

编辑

根据您提供的额外信息,您试图实现的中间件有点过头了。相反,您可以简单地使用单个路由并传入状态参数。有关路由参数的更多信息,请参阅https://laravel.com/docs/5.6/routing#route-参数。

示例:

Route::get('/your_route/{status}', 'YourController@ControllerAction');

然后在您的控制器中,根据状态处理逻辑:

function ControllerAction(Request $request, $status) {
if ($status == 0) {
//Show view for A
} else {
//Show view for B
}
}

最新更新