我有此路线
Route::group(['middleware' => 'returnphase'], function () {
Route::get('/', 'FrontendController@home')->name('homepage');
});
我的中间件检查在哪个阶段(逻辑现在不重要)是我的应用程序,我需要控制器设置一个全局变量,我可以在frontendendController内的所有方法中使用,因为我需要从数据库中读取一些依赖的数据从该检查:
中间件代码,我需要设置一个可以在5月frontend Controller中使用的epase_id varibale。
namespace CbccHttpMiddleware;
use Closure;
class ReturnPhaseMiddleware
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
/**
* TODO: Phase id check logic
*/
// SETTING GLOBAL PHASE ID VARIABLE (EXAMPLE PHASE_ID = 1)
return $next($request);
}
}
我的前端控制器
//FrontEndController
namespace CbccHttpControllers;
use CbccPage;
use IlluminateHttpRequest;
class FrontendController extends Controller
{
public function home()
{
$page = Page::where([
['phase_id',/**** I NEED GLOBAL PHASE ID HERE SETTING BY MIDDLEWARE***/],
['type','home']
])->get()[0];
return view('frontend.index',compact('page'));
}
}
有什么想法?
您可能需要使用用户会话变量。使用Flash会话变量怎么办,因为您似乎只使用此变量一次:
中间件
class ReturnPhaseMiddleware
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
/**
* TODO: Phase id check logic
*/
$request->session()->flash('PHASE_ID', '1');
return $next($request);
}
}
前端控制器
class FrontendController extends Controller
{
public function home(Request $request)
{
$page = Page::where([
['phase_id', $request->session()->get('PHASE_Id')],
['type','home']
])->get()[0];
return view('frontend.index',compact('page'));
}
}
闪存会话变量的特殊属性是它们在下一个请求中被销毁。
参考:https://laravel.com/docs/5.4/session#flash-data
良好的策略,而不使用会话?
您如何看待我的解决方案?
// Frontend Controlller
namespace CbccHttpControllers;
use CbccLibCheckPhaseInterface;
use CbccPage;
class FrontendController extends Controller
{
protected
$phase_id;
public function __construct()
{
$this->middleware(function ($request, $next) {
// this 2 lines return phase id logic, for example $check->run() return 1 (int)
$check = resolve(CheckPhaseInterface::class);
$this->phase_id = $check->run();
return $next($request);
});
}
public function home()
{
$page = $this->getPageContent();
return view('frontend.index',compact('page'));
}
protected function getPageContent()
{
return Page::where([
['phase_id',$this->phase_id],
['type','home']
])->get()[0];
}
}