摘要:本文主要學(xué)習(xí)總結(jié)下間參數(shù)傳遞。開發(fā)時(shí)經(jīng)常碰到類似場(chǎng)景有時(shí)需要在中讀取中設(shè)置的和,有時(shí)也需要在中讀取中設(shè)置的參數(shù)。總結(jié)下這幾個(gè)知識(shí)點(diǎn),便于查閱。
本文主要學(xué)習(xí)總結(jié)下Route,Middleware,Controller間參數(shù)傳遞。開發(fā)時(shí)經(jīng)常碰到類似場(chǎng)景:有時(shí)需要在Middleware中讀取Route中設(shè)置的middleware parameter和route parameter,有時(shí)也需要在Controller@Action中讀取Middleware中設(shè)置的參數(shù)。
先假設(shè)路由是:
Route::group(["prefix" => "route", "namespace" => "RouteParameter"], function () { // route/user/{user}/role/{role}, route parameter是{user}, {role} Route::group(["middleware" => "route.parameter"], function () { Route::resource("user.role", "RouteParameterToMiddlewareController"); }); // route/advisor, middleware parameter是 "advisor", "show", "comment" Route::group(["middleware" => "middleware.parameter:advisor,show,comment"], function () { Route::resource("advisor", "MiddlewareParameterToMiddlewareController"); }); // /route/controller, middleware parameter是 "client" Route::group(["middleware" => "middleware.controller:client"], function () { Route::resource("controller", "MiddlewareToController"); }); });
路由對(duì)應(yīng)的控制器是:
namespace AppHttpControllersRouteParameter; use IlluminateHttpRequest; use AppHttpControllersController; class RouteParameterToMiddlewareController extends Controller { public function show($user, $role) { } } namespace AppHttpControllersRouteParameter; use IlluminateHttpRequest; use AppHttpControllersController; class MiddlewareParameterToMiddlewareController extends Controller { public function index() { return "All"; } }
并且在Kernel.php中注冊(cè)中間件:
$routeMiddlewares = [] ... "route.parameter" => AppHttpMiddlewareRouteParameter::class, "middleware.parameter" => AppHttpMiddlewareMiddlewareParameter::class, "middleware.controller" => AppHttpMiddlewareControllerParameter::class, ;Passing Route Parameters to Middleware
在中間件route.parameter中讀取路由參數(shù)有三種方式:$request->route($parameter_name);$request->route()->parameter($parameter_name);$request->route()->parameters(),代碼如下:
route("user"); $user = $request->route()->parameter("user"); // {user} $role = $request->route()->parameter("role"); // {role} dd($user, $role); $parameters = $request->route()->parameters(); // ["user" => {user}, "role" => {role}] dd($parameters["user"], $parameters["role"]); return $next($request); } }Passing Middleware Parameters to Middleware
在中間件middleware.parameter中讀取中間件參數(shù)只需要在handle()中映射上對(duì)應(yīng)的參數(shù)變量就行,就和在Controller@Action中獲取路由參數(shù)一樣:
namespace AppHttpMiddleware; use Auth; use Closure; use IlluminateHttpResponse; class MiddlewareParameter { /** * Handle an incoming request. * * @param IlluminateHttpRequest $request * @param Closure $next * @param $role * @param $action * @param $data * * @return mixed */ public function handle($request, Closure $next, $role, $action, $data) { dd($role, $action, $data); // "advisor", "show", "comment" if (Auth::check() && (Auth::user()->type === $role)) { return $next($request); } return abort(Response::HTTP_UNAUTHORIZED, "You must log in to access the resource.", [ "Set-Cookie" => "Laravel=0; path=/; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Secure", ]); } }Passing Parameters in Middleware to Controller
有時(shí)需要在中間中把參數(shù)傳遞到控制器中,則可以通過Request對(duì)象作為傳輸管道,代碼如:
namespace AppHttpMiddleware; use Closure; class ControllerParameter { /** * Handle an incoming request. * * @param IlluminateHttpRequest $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next, $role) { $request->attributes->add(compact("role")); // "client" return $next($request); } }
控制器中使用Request對(duì)象獲取$role參數(shù):
namespace AppHttpControllersRouteParameter; use IlluminateHttpRequest; use AppHttpControllersController; class MiddlewareToController extends Controller { public function index(Request $request) { dd($request->get("role")); } }
總結(jié):Route,Middleware,Controller之間傳遞參數(shù)這個(gè)知識(shí)點(diǎn)會(huì)經(jīng)常在設(shè)計(jì)代碼時(shí)用到,還有從Route中傳遞參數(shù)到Controller中,這個(gè)就更是經(jīng)常要用到的,也簡(jiǎn)單。總結(jié)下這幾個(gè)知識(shí)點(diǎn),便于查閱。
RightCapital招聘Laravel DevOps
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/21971.html
摘要:下面是剛才說的這些步驟對(duì)應(yīng)的核心代碼收集路由和控制器里應(yīng)用的中間件我們?cè)谇懊娴奈恼吕镆呀?jīng)詳細(xì)的解釋過中間件和路由的原理了,接下來就看看當(dāng)請(qǐng)求最終找到了路由對(duì)應(yīng)的控制器方法后是如何為控制器方法注入正確的參數(shù)并調(diào)用控制器方法的。 控制器 控制器能夠?qū)⑾嚓P(guān)的請(qǐng)求處理邏輯組成一個(gè)單獨(dú)的類, 通過前面的路由和中間件兩個(gè)章節(jié)我們多次強(qiáng)調(diào)Laravel應(yīng)用的請(qǐng)求在進(jìn)入應(yīng)用后首現(xiàn)會(huì)通過Http Ker...
摘要:入口啟動(dòng)后,會(huì)先加載服務(wù)提供者中間件等組件,在查找路由之前因?yàn)槲覀兪褂玫氖情T面,所以先要查到的實(shí)體類。注冊(cè)第一步當(dāng)然還是通過服務(wù)提供者,因?yàn)檫@是啟動(dòng)的關(guān)鍵,在內(nèi)加載路由文件。因路由文件中沒有命名空間。 showImg(https://segmentfault.com/img/bVbhjvY?w=600&h=296); 前言 我的解析文章并非深層次多領(lǐng)域的解析攻略。但是參考著開發(fā)文檔看此...
摘要:官方地址是目前最流行的框架,發(fā)展勢(shì)頭迅猛,應(yīng)用非常廣泛,有豐富的擴(kuò)展包可以應(yīng)付你能想到的各種應(yīng)用場(chǎng)景,框架思想前衛(wèi),跟隨時(shí)代潮流,提倡優(yōu)雅代碼,自稱為工匠,其中的模板引擎容器以及擴(kuò)展包為業(yè)務(wù)的開發(fā)提供了極大的便利。 laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,發(fā)展勢(shì)頭迅猛,應(yīng)用非常廣泛,有豐富的擴(kuò)展包可以應(yīng)付你能想到的各種應(yīng)用場(chǎng)景,lara...
摘要:解析出后將進(jìn)入應(yīng)用的請(qǐng)求對(duì)象傳遞給的方法,在方法負(fù)責(zé)處理流入應(yīng)用的請(qǐng)求對(duì)象并返回響應(yīng)對(duì)象。攜帶了本次迭代的值。通過這種方式讓請(qǐng)求對(duì)象依次流過了要通過的中間件,達(dá)到目的地的方法。 中間件(Middleware)在Laravel中起著過濾進(jìn)入應(yīng)用的HTTP請(qǐng)求對(duì)象(Request)和完善離開應(yīng)用的HTTP響應(yīng)對(duì)象(Reponse)的作用, 而且可以通過應(yīng)用多個(gè)中間件來層層過濾請(qǐng)求、逐步完善...
摘要:本文將會(huì)源碼分析下是如何把開發(fā)者在中寫的路由列表注冊(cè)到對(duì)象內(nèi)的。通過以上的分析,就能對(duì)路由系統(tǒng)的基本設(shè)計(jì)越來越清晰。一個(gè)進(jìn)來后,首先開始啟動(dòng)并按照以上邏輯開始注冊(cè)路由列表,然后就是根據(jù)當(dāng)前信息查找對(duì)應(yīng)的對(duì)象。 我們知道,在 Laravel 世界里,外界傳進(jìn)來一個(gè) Request 時(shí),會(huì)被 Kernel 處理并返回給外界一個(gè) Response。Kernel 在處理 Request 時(shí),會(huì)...
閱讀 2185·2021-09-02 15:11
閱讀 1507·2019-08-30 15:43
閱讀 2073·2019-08-29 13:48
閱讀 2790·2019-08-26 13:55
閱讀 2100·2019-08-23 15:09
閱讀 2896·2019-08-23 14:40
閱讀 3422·2019-08-23 14:23
閱讀 2632·2019-08-23 14:20