自定义Laravel 5.1中间件逻辑

时间:2015-08-31 16:11:03

标签: php laravel

我遇到了这个问题,我在Laravel 5.1中遇到了设置自定义中间件的问题

这就是我想要的。

我希望用户在登录我的应用时完成设置步骤。 如果他完成设置,他不应该再次看到该设置页面。 我也在全局数组中设置这个中间件。

这是我的中间件。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\RedirectResponse;

class SetupMiddleware
{


    /**
     * 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->check()){


            if( $this->auth->user()->active == false ){

                if ($request->ajax())
                {
                    return response('Not verified.', 401);
                }
                else
                {
                    return redirect('/user/verification');
                }

            }



            if( $this->auth->user()->active != false &&  null === Auth::user()->school ){

                if ($request->ajax())
                {
                    return response('Not allowed.', 401);
                }
                else
                {
                    return redirect('/setup/info');
                }

            }



            if( $this->auth->user()->active != false &&  null !== Auth::user()->school &&  $this->auth->user()->payment_active == false ){

                if ($request->ajax())
                {
                    return response('Not allowed.', 401);
                }
                else
                {
                    return redirect('/setup/payment');
                }

            }



            if( $this->auth->user()->active != false && null !== Auth::user()->school &&  $this->auth->user()->payment_active != false ){


                return $next($request);

            }

            return $next($request);
        }


        return $next($request);
    }
}

他也不应该看到已经完成的步骤。假设用户是否创建了相关模型&#34; school&#34;他应该被重定向到'设置/付款'#39; url而不是&#39; setup / info&#39;。现在,即使我完成了所有步骤,我也可以登录并访问每一步。

如果条件匹配,则手动重定向到每个步骤是我到目前为止看到的唯一选项,但这种方法使我的控制器太混乱。

1 个答案:

答案 0 :(得分:1)

您似乎并不理解编程流程。 如果您执行$this->auth->user()->active == false,则无需执行$this->auth->user()->active != false,就好像它会有错误一样,它会返回重定向标头。 所有其他条件都一样。

现在要处理实际问题,而不是使用middleware,您应该使用表单请求方法,然后通过session保存用户当前步骤并使用您从会话获得的数据重定向他。 [应该创建一种帮助来处理重定向的实际路由]