我遇到了在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');