Laravel-Midlleware在控制器构造后调用

问题描述 投票:0回答:1

我在使用SectionsController构造函数之后调用的checkauth控制器时遇到麻烦-从这里扩展了ReportController,我不知道为什么会这样工作。我尝试在SectionController结构的开头添加中间件,例如$ this-> middleware('checkauth');,但也无法正常工作。

中间件

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;


class CheckAuth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!Auth::check())
        {
            return redirect('/admin/login')->withErrors(['message' => 'You need to login before proceeding']);
        }

        return $next($request);
    }
}

ReportController

<?php

namespace App\Http\Controllers\RMReport\Form;

use App\Http\Controllers\RMReport\SectionsController;
use Illuminate\Http\Request;
use Illuminate\Support\Str;


class ReportController extends SectionsController
{

    public function __construct(){
  /*     dump("REPORT CONTROLLER:");
       dump(\Auth::check());*/
      parent::__construct();
    }
.
.
.
}

SectionsController

<?php

namespace App\Http\Controllers\RMReport;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Support\Facades\View;
use App\Http\Controllers\Controller;
use Illuminate\Http\UploadedFile;



class SectionsController extends BaseController
{
  use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function __construct(){
      $this->middleware('checkauth');

      dump("SECTIONSCONTROLLER: ");
      dump(\Auth::check());
    }
}

来自路线:列表的输出

GET|HEAD | admin/remote-report/{id?} | rm.report | App\Http\Controllers\RMReport\Form\ReportController@form | web,checkauth,checkownerRMreport |  
POST | admin/remote-report/{id?} | rm.report | App\Http\Controllers\RMReport\Form\ReportController@store | web,checkauth,checkownerRMreport |

通话输出GET

"SECTIONSCONTROLLER: "

false

"CHECKAUTH:"

true
php laravel laravel-5 middleware laravel-middleware
1个回答
0
投票

了解Laravel生命周期和对象生命周期很重要。创建新对象时,将首先调用构造函数。当新的SectionsController()动作发生时,它将立即触发构造函数,因为构造函数调用了中间件,因此它无法知道应该在其之前运行。

这意味着在请求生命周期中,控制器构造函数必须在中间件之前。幸运的是,此问题已解决,如果您在构造函数中对依赖于中间件的逻辑使用回调,则可以避免此问题。

$this->middleware(function ($request, $next) {
    dump("SECTIONSCONTROLLER: ");
    dump(\Auth::check());
});
© www.soinside.com 2019 - 2024. All rights reserved.