自定义中间件检查模型自定义函数Laravel 5.1上返回的值时出错

时间:2016-06-10 12:49:38

标签: laravel-5.1 laravel-middleware

我有一个帐户电子邮件确认我的Laravel应用程序,然后我想检查用户何时尝试登录,如果用户已激活他的帐户。

我发现了这个:https://laracasts.com/discuss/channels/general-discussion/how-to-test-if-a-user-which-tries-to-log-in-is-confirmed-yet

我有一个自定义模型函数isActivated,只返回用户模型上的状态attibute(boolean类型,在西班牙语中命名为estado)。

在我的用户模型上:

public function isActivated()
{
    return $this->estado;
}

我创建了我的中间件类似上面提供的链接建议,然后我在App / Http / Kernel.php中注册为中间件路由

当我将中间件分配给我的路由时(而不是在我的控制器中创建构造函数,我希望这个中间件只是在登录控制器的post请求上),问题就来了。

当我尝试登录时抛出错误:

Fatal Throwable Error: 
Fatal Error: Call to a member function isActivated() on null

我的中间件看起来很像链接

<?php

 namespace App\Http\Middleware;

 use Closure;
 use Illuminate\Contracts\Auth\Guard;

 class RedirectIfNotMailActivated
{
/**
 * The Guard implementation.
 *
 * @var Guard
 */
protected $auth;

/**
 * Create a new filter instance.
 *
 * @param  Guard  $auth
 * @return void
 */
public function __construct(Guard $auth)
{
    $this->auth = $auth;
}
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if ( ! $this->auth->user()->isActivated()) {
        return redirect('/login')
            ->with('mensaje',
                   '¡Lo sentimos, no ha confirmado su cuenta aún!');
    } else {
        return $next($request);
    }
 }
}

有趣的部分:如果我在App / Http / Middleware / Authenticate(auth中间件)中添加我的中间件的句柄功能的内容,然后我将一些路由分组并附加到此中间件,这可以按预期工作(不是允许未确认的用户登录)

问题是我在用户表中为用户类型(管理员和客户)建立了一个polimorphic关系,所以我将管理员控制面板连接到auth中间件并将其分组,因为我需要为经过身份验证的用户重新设置对控制面板的访问权限。管理员类型(不允许客户用户类型)。

限制仅适用于管理员用户类型。

并且coursethis允许客户用户类型可以登录,因为如果他的帐户被确认,我什么也没有。

我做错了什么... isActivated模型函数在auth中间件中添加时工作正常,但是当我在自定义中间件中使用相同的方法时没有。

...谢谢

EDITED

我的中间件已归为我登录控制器的post方法

Route::post('/login', [
        'middleware' => 'activated.email',
        'uses' => 'loginController@store'
]);
PD:对不起长篇文章和糟糕的英语习惯,这不是我的第一语言:(

1 个答案:

答案 0 :(得分:0)

您的逻辑存在问题。您的登录路径不应该被我激活的用户保护,因为中间件在请求之前执行,因此用户无法尝试登录您的案例并因此而导致错误。

您可以执行的操作是在验证中间件中添加isActivated()支票,这样您就会有一个已登录的用户并且$this->auth->user()赢得了&#39; t为空。