我编写了自定义中间件,但是当它被执行时,出现了错误。中间件:
namespace AppHttpMiddleware;
use Closure;
use IlluminateSupportFacadesAuth;
use AppEmployee;
class CheckConfirm
{
public function handle($request, Closure $next)
{
if(Auth::check())
{
$id = Auth::id();
$empl = Employee::where('user_id','=', $id)->get();
if($empl->isEmpty())
{
return route('confirm');
}
else
{
dump($empl);
return $next($request);
}
}
else
{
return route('login');
}
}
}
当我尝试这样的事情时:
if($empl===null)
{
return route('confirm');
}
只是不起作用。在这种情况下,数据库查询将成功执行。这是带有dump
中间件必须返回Response
对象,否则$next($request)
。如前所述,当未登录或$empl
为空时,您的中间件只是返回一个字符串,而不是重定向。
将您的退货更新至:
return redirect()->route('confirm');
和
return redirect()->route('login');
分别。
这很难修复,我尝试使用App\Http\Middleware\VerifyCsrfToken::except来做到这一点,但不起作用。
我对这个问题的解决方案是使用 App\Exception\Handler::render 方法创建重定向到另一条路由。
if ($exception->getMessage() == "Trying to get property 'headers' of non-object") {
return redirect()->route('my.default.page');
}
替换此行:
$empl = Employee::where('user_id','=', $id)->get();
if($empl->isEmpty()){ ... }
有了这个:
$empl = Employee::where('user_id', $id)->first();
if($empl){ ... }
然后 dd(( 对于每一行,看看它在哪里失败。可能缺少 csrf 令牌或未记录用户。