2017-10-18 119 views
0

我在app\ExceptionsHandler.php中有一些代码检查URL是否存在,如果不存在,那么它会检查数据库是否是自定义URL,如果是的话就会返回一个视图。我认为这个问题是因为它没有通过网络中间件传递,所以会话和身份验证都没有启动,因为Auth::id()为空,即使我100%登录Laravel 5缺少页面和authed用户

是否有一个更容易如何做到这一点?

public function render($request, Exception $exception) 
{ 
    if($exception instanceof NotFoundHttpException) 
    { 
     if(\App\EventMeter::isURL()) { 
      $ec = new EventsController(); 
      return $ec->eventMeter(); 
     } 
     if(\App\Tournament::isTournamentURL()) { 
      $t = new TournamentController(); 
      return $t->home(); 
     } 
     if(BountyHunter::isURL()) 
     { 
      $bhc = new BountyHunterController(); 
      return $bhc->home(); 
     } 

     return response()->view('errors.missing',array(), 404); 
    } 

    return parent::render($request, $exception); 
} 
+0

我想因为你实例化了控制器!只是重定向当前请求,像这样'return redirect() - > route('route.name');' – Maraboc

+0

这并不能解决问题,因为URL总是动态的。如果我要让路由成为一个静态的URL,那么这将工作正常,但URL永远不会保持不变 – Ben

+0

命中此方法'$ ec-> eventMeter()'的URL会改变? – Maraboc

回答

3

也许这是你应该把责任转移到你的路由。


Route::get('{uri}', ['uses' => '[email protected]', 'as' => 'page']) 
     ->where('uri', '.*'); 

控制器可以处理所有的意见,并可以执行路由和重定向,让你有任何其他的路线,你所需要的。通过创建一个类,例如一个LayoutService,它可以处理所有您可以重定向到适当位置的不同事件,锦标赛,赏金。这将让您可以访问所有的网络中间件。

// Logic to determine what method you want to be called 
$template = 'events|tournament|etc'; 

if (method_exists($this->layoutService, $template) 
     && is_callable(array($this->layoutService, $template))) { 
     return call_user_func(
     array($this->layoutService, $template) 
    ); 
}