Laravel-在控制器构造之后调用的中间件


编辑:更好的示例

我遇到了在SectionsController构造函数之后调用的checkauth控制器的问题——这是扩展的ReportController,我不知道为什么它会这样工作。我尝试在SectionController成本结构的开头添加中间件,比如$this->中间件("checkauth"(但也不起作用。

中间件

<?php
namespace AppHttpMiddleware;
use Closure;
use Auth;

class CheckAuth
{
/**
* Handle an incoming request.
*
* @param  IlluminateHttpRequest  $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);
}
}

章节控制器

<?php
namespace AppHttpControllersRMReport;
use IlluminateFoundationBusDispatchesJobs;
use IlluminateRoutingController as BaseController;
use IlluminateFoundationValidationValidatesRequests;
use IlluminateFoundationAuthAccessAuthorizesRequests;
use IlluminateSupportFacadesView;
use AppHttpControllersController;
use IlluminateHttpUploadedFile;

class SectionsController extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
protected $user;
public function __construct(){
$this->middleware('checkauth');
dump("SECTIONSCONTROLLER: ");
dump(Auth::check());
//PROBLEM HERE - Auth::Check is false , Auth::user is null
$this->user = Auth::user();
if( !$this->user->can('something') ) return redirect()->route('someroute');
}
}

ReportController

<?php
namespace AppHttpControllersRMReportForm;
use AppHttpControllersRMReportSectionsController;
use IlluminateHttpRequest;
use IlluminateSupportStr;

class ReportController extends SectionsController
{
public function form(){
if( $this->user->status != 'Active'){
return something;
}
return another something;
}
}

路线输出:列出

GET|HEAD | admin/remote-report/{id?} | rm.report | AppHttpControllersRMReportFormReportController@form | web,checkauth,checkownerRMreport |  
POST | admin/remote-report/{id?} | rm.report | AppHttpControllersRMReportFormReportController@store | web,checkauth,checkownerRMreport |

输出呼叫GET

"SECTIONSCONTROLLER: "
false
"CHECKAUTH:"
true

了解Laravel生命周期和对象生命周期非常重要。当创建一个新对象时,构造函数将在其他任何对象之前被调用。当新SectionsController((的操作发生时,它将立即触发构造函数,因为构造函数调用中间件,它无法知道它之前应该运行。

这意味着在请求生命周期中,控制器构造函数必须在中间件之前。幸运的是,这个问题已经解决了,如果您在构造函数中使用中间件相关逻辑的回调,您将避免这个问题。

$this->middleware(function ($request, $next) {
dump("SECTIONSCONTROLLER: ");
dump(Auth::check());
});

EDIT您可以使用Laravel中间件执行策略,而不是在构造函数中执行所有错误的操作。这需要您使用Authorize中间件,根据标准,Authorize中间件已启用。

$this->middleware('can:something');

最新更新