处理程序错误 Class - Laravel
Error in Handler Class - Laravel
我正在使用 Laravel 5.5 并尝试为用户和管理员实施多重身份验证。当我尝试在浏览器中调用管理员登录表单时出现此错误。
错误:
Declaration of App\Exceptions\Handler::unauthenticated($request, App\Exceptions\AuthenticationException $exception) should be compatible with Illuminate\Foundation\Exceptions\Handler::unauthenticated($request, Illuminate\Auth\AuthenticationException $exception)
这是我在 app/Exceptions/Handler
中未经身份验证的函数:
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
$guard = array_get($exception->guards(), 0);
switch ($guard) {
case 'admin':
$login = 'admin.login';
break;
default:
$login = 'login';
break;
}
return redirect()->guest(route($login));
}
请帮我解决这个问题。
您忘记在文件顶部添加 use Illuminate\Auth\AuthenticationException
我正在使用 Laravel 7.X
我更喜欢在 Authenticate middleware
中这样做
我像下面那样做了,它对我来说效果很好。
namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Support\Arr;
class Authenticate extends Middleware
{
protected $guards = [];
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string[] ...$guards
* @return mixed
*
* @throws \Illuminate\Auth\AuthenticationException
*/
public function handle($request, Closure $next, ...$guards)
{
$this->guards = $guards;
return parent::handle($request, $next, ...$guards);
}
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
if (Arr::first($this->guards) === 'admin') {
return route('admin.login');
}
return route('trainee.login');
}
}
}
感谢 Thanh Nguyen 最近的回答。我的自定义身份验证中间件适用于最新版本
if (Arr::first($this->guards) === 'admin') {
return route('admin.login');
}
return route('customer.login');
以前在 Handler.php 中使用未经验证的函数来替换父函数。
protected function unauthenticated($request, AuthenticationException $exception)
{
$guard = Arr::get($exception->guards(), 0);
switch ($guard) {
case 'respondent':
$login = 'respondents.login';
break;
case 'admin':
$login = 'admin.login';
break;
default:
$login = 'admin.login';
break;
}
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route($login));
}
两者都有效,但 array_get 上的最新版本可能存在问题,无法获取我们使用的守卫:
$guard = array_get($exception->guards(), 0);
对于遇到此问题的任何人,Laravel 7.* 及更高版本已弃用此方法
我正在使用 Laravel 5.5 并尝试为用户和管理员实施多重身份验证。当我尝试在浏览器中调用管理员登录表单时出现此错误。
错误:
Declaration of App\Exceptions\Handler::unauthenticated($request, App\Exceptions\AuthenticationException $exception) should be compatible with Illuminate\Foundation\Exceptions\Handler::unauthenticated($request, Illuminate\Auth\AuthenticationException $exception)
这是我在 app/Exceptions/Handler
中未经身份验证的函数:
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
$guard = array_get($exception->guards(), 0);
switch ($guard) {
case 'admin':
$login = 'admin.login';
break;
default:
$login = 'login';
break;
}
return redirect()->guest(route($login));
}
请帮我解决这个问题。
您忘记在文件顶部添加 use Illuminate\Auth\AuthenticationException
我正在使用 Laravel 7.X
我更喜欢在 Authenticate middleware
中这样做
我像下面那样做了,它对我来说效果很好。
namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Support\Arr;
class Authenticate extends Middleware
{
protected $guards = [];
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string[] ...$guards
* @return mixed
*
* @throws \Illuminate\Auth\AuthenticationException
*/
public function handle($request, Closure $next, ...$guards)
{
$this->guards = $guards;
return parent::handle($request, $next, ...$guards);
}
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
if (Arr::first($this->guards) === 'admin') {
return route('admin.login');
}
return route('trainee.login');
}
}
}
感谢 Thanh Nguyen 最近的回答。我的自定义身份验证中间件适用于最新版本
if (Arr::first($this->guards) === 'admin') {
return route('admin.login');
}
return route('customer.login');
以前在 Handler.php 中使用未经验证的函数来替换父函数。
protected function unauthenticated($request, AuthenticationException $exception)
{
$guard = Arr::get($exception->guards(), 0);
switch ($guard) {
case 'respondent':
$login = 'respondents.login';
break;
case 'admin':
$login = 'admin.login';
break;
default:
$login = 'admin.login';
break;
}
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route($login));
}
两者都有效,但 array_get 上的最新版本可能存在问题,无法获取我们使用的守卫:
$guard = array_get($exception->guards(), 0);
对于遇到此问题的任何人,Laravel 7.* 及更高版本已弃用此方法