Php Laravel一次只能访问两条路线中的一条
如果我的web.php中有两条路由A和B。如何进行如下中间件检查:Php Laravel一次只能访问两条路线中的一条,php,laravel,middleware,laravel-routing,laravel-5.6,Php,Laravel,Middleware,Laravel Routing,Laravel 5.6,如果我的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如果满足条件,则允许如果不显
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如果状态为1,则显示路由B。如果我试图访问url/routeB?listID1
,则直接检查条件(对于id1
)并显示路线A或B
状态中只有0或1。如果状态为1,则所有用户都将直接访问routeB,如果状态为0,则第一个访问routeA的用户将执行一些操作(将状态设置为1)重定向到routeB。他之后的下一个用户将直接到达routeB您可以使用route name并在任何地方使用它
//define route
Route::get('/A', 'ControllerA@methodA')->name('A');
Route::get('/B', 'ControllerB@methodB')->name('B');
在控制器中,只需使用路由名称
否则,可以通过获取路由组参数来执行某些操作
您可以使用路由名称,并且只需在任何地方使用它即可
//define route
Route::get('/A', 'ControllerA@methodA')->name('A');
Route::get('/B', 'ControllerB@methodB')->name('B');
在控制器中,只需使用路由名称
否则,可以通过获取路由组参数来执行某些操作
如果需要,可以从中间件执行重定向:
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');
Route::get('/your_route/{status}', 'YourController@ControllerAction');
编辑:
根据您提供的其他信息,您试图实现的中间件有点过头了。相反,您可以简单地使用单个路由并传入状态参数。有关布线参数的详细信息,请参见
例如:
Route::get('/route_a', 'YourController@RouteA')->name('route_a_name');
Route::get('/your_route/{status}', 'YourController@ControllerAction');
然后在控制器中,根据状态处理逻辑:
function ControllerAction(Request $request, $status) {
if ($status == 0) {
//Show view for A
} else {
//Show view for B
}
}
如果需要,可以从中间件执行重定向:
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');
Route::get('/your_route/{status}', 'YourController@ControllerAction');
编辑:
根据您提供的其他信息,您试图实现的中间件有点过头了。相反,您可以简单地使用单个路由并传入状态参数。有关布线参数的详细信息,请参见
例如:
Route::get('/route_a', 'YourController@RouteA')->name('route_a_name');
Route::get('/your_route/{status}', 'YourController@ControllerAction');
然后在控制器中,根据状态处理逻辑:
function ControllerAction(Request $request, $status) {
if ($status == 0) {
//Show view for A
} else {
//Show view for B
}
}
每个用户的状态不同?状态中只有0或1。如果状态为1,则所有用户都将直接访问routeB,如果状态为0,则第一个访问routeA的用户将执行一些操作(将状态设置为1)重定向到routeB。他之后的下一个用户将直接到达routeB。当他们执行操作时,肯定会重定向,然后所有其他用户将在middlewareYes中点击else条件,但我如何设置条件?您是否考虑过laravel策略来解决您的目的?每个用户的状态不同?状态中只有0或1。如果状态为1,则所有用户都将直接访问routeB,如果状态为0,则第一个访问routeA的用户将执行一些操作(将状态设置为1)重定向到routeB。他之后的下一个用户将直接到达routeB。当他们执行此操作时,肯定会重定向,然后所有其他用户将在middlewareYes中达到else条件,但我如何设置条件?您是否考虑过laravel policy
来解决您的目的?我可能没有路由名称数组,它只是增加了一层复杂性。除非您有很多路由,否则只需将它们写在数组的位置。@JustCarty您在这方面是正确的,但我认为当出现更多条件时,这会有所帮助。我不希望通过url访问路由,除非选中条件。所以我不想只在web.php中添加路由,让它们可以自由访问。我需要//define routes
中的if语句。我不知道如何在if
语句中访问另一个routes的参数。@Victordb我不确定您是否需要类似这样的“Route::get('/Route/{id}',函数($id){if($id==1){//do something}else{//do others};”是的,但由于某些原因,我无法在Route::group(['prefix'=>'/')函数($id)中使用它
。我可能没有路由名称数组,这只是增加了一层复杂性。除非有很多路由,否则只需将它们写在数组的位置。@JustCarty你在这方面是对的,但我认为当更多条件发生时,这会很有帮助。我不希望通过url访问路由,除非条件被选中。所以我不希望只想在web.php中添加路由并让它们自由访问。我需要//定义路由
中的if语句。我不知道如何从if
语句中的另一个路由访问参数。@victorb我不确定您是否想要这样的'Route::get('/Route/{id}',函数($id){if($id==1){//do something}else{//do others}});“是的,但由于某种原因,我不能在Route::group(['prefix'=>'/'),函数($id)中使用它”
。我不想通过url访问路由,因为条件已检查。所以我不想只在web.php中添加路由并让它们自由访问。那么为什么要使用中间件呢?为什么不只使用一条路由并传递状态?例如,路由::get('/your_route/{status}','YourController@YourAction')
你说得对,我只做了1条路由,我在控制器中检查了状态,并根据状态返回了相应的视图。请使用此选项编辑你的答案,我将对其进行投票。谢谢。更新。谢谢。我不希望通过url访问路由,因为条件已检查。因此,我不想只在中添加路由使用web.php并让em