在所有控制器方法Laravel 5.3中设置易于访问的全局变量



我有此路线

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];
    }
}

相关内容

  • 没有找到相关文章

最新更新