Laravel一次只能访问两条路线中的一条

时间:2018-07-13 15:54:49

标签: 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,如果满足条件,则允许不显示路线B。路线B也是如此。

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

状态仅0或1。如果状态为1,则所有用户将直接访问routeB,如果状态为0,则到达该位置的第一个用户将访问routeA进行某些操作(将状态设置为1),将其重定向到routeB。他之后的下一个用户将直接到达routeB

2 个答案:

答案 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');