摘要:本文主要學(xué)習(xí)總結(jié)下間參數(shù)傳遞。開發(fā)時經(jīng)常碰到類似場景有時需要在中讀取中設(shè)置的和,有時也需要在中讀取中設(shè)置的參數(shù)。總結(jié)下這幾個知識點,便于查閱。
本文主要學(xué)習(xí)總結(jié)下Route,Middleware,Controller間參數(shù)傳遞。開發(fā)時經(jīng)常碰到類似場景:有時需要在Middleware中讀取Route中設(shè)置的middleware parameter和route parameter,有時也需要在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"); }); });
路由對應(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中注冊中間件:
$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()中映射上對應(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ù)傳遞到控制器中,則可以通過Request對象作為傳輸管道,代碼如:
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對象獲取$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ù)這個知識點會經(jīng)常在設(shè)計代碼時用到,還有從Route中傳遞參數(shù)到Controller中,這個就更是經(jīng)常要用到的,也簡單??偨Y(jié)下這幾個知識點,便于查閱。
RightCapital招聘Laravel DevOps
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21971.html
摘要:下面是剛才說的這些步驟對應(yīng)的核心代碼收集路由和控制器里應(yīng)用的中間件我們在前面的文章里已經(jīng)詳細的解釋過中間件和路由的原理了,接下來就看看當(dāng)請求最終找到了路由對應(yīng)的控制器方法后是如何為控制器方法注入正確的參數(shù)并調(diào)用控制器方法的。 控制器 控制器能夠?qū)⑾嚓P(guān)的請求處理邏輯組成一個單獨的類, 通過前面的路由和中間件兩個章節(jié)我們多次強調(diào)Laravel應(yīng)用的請求在進入應(yīng)用后首現(xiàn)會通過Http Ker...
摘要:入口啟動后,會先加載服務(wù)提供者中間件等組件,在查找路由之前因為我們使用的是門面,所以先要查到的實體類。注冊第一步當(dāng)然還是通過服務(wù)提供者,因為這是啟動的關(guān)鍵,在內(nèi)加載路由文件。因路由文件中沒有命名空間。 showImg(https://segmentfault.com/img/bVbhjvY?w=600&h=296); 前言 我的解析文章并非深層次多領(lǐng)域的解析攻略。但是參考著開發(fā)文檔看此...
摘要:官方地址是目前最流行的框架,發(fā)展勢頭迅猛,應(yīng)用非常廣泛,有豐富的擴展包可以應(yīng)付你能想到的各種應(yīng)用場景,框架思想前衛(wèi),跟隨時代潮流,提倡優(yōu)雅代碼,自稱為工匠,其中的模板引擎容器以及擴展包為業(yè)務(wù)的開發(fā)提供了極大的便利。 laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,發(fā)展勢頭迅猛,應(yīng)用非常廣泛,有豐富的擴展包可以應(yīng)付你能想到的各種應(yīng)用場景,lara...
摘要:解析出后將進入應(yīng)用的請求對象傳遞給的方法,在方法負責(zé)處理流入應(yīng)用的請求對象并返回響應(yīng)對象。攜帶了本次迭代的值。通過這種方式讓請求對象依次流過了要通過的中間件,達到目的地的方法。 中間件(Middleware)在Laravel中起著過濾進入應(yīng)用的HTTP請求對象(Request)和完善離開應(yīng)用的HTTP響應(yīng)對象(Reponse)的作用, 而且可以通過應(yīng)用多個中間件來層層過濾請求、逐步完善...
摘要:本文將會源碼分析下是如何把開發(fā)者在中寫的路由列表注冊到對象內(nèi)的。通過以上的分析,就能對路由系統(tǒng)的基本設(shè)計越來越清晰。一個進來后,首先開始啟動并按照以上邏輯開始注冊路由列表,然后就是根據(jù)當(dāng)前信息查找對應(yīng)的對象。 我們知道,在 Laravel 世界里,外界傳進來一個 Request 時,會被 Kernel 處理并返回給外界一個 Response。Kernel 在處理 Request 時,會...
閱讀 2212·2021-09-02 15:11
閱讀 1530·2019-08-30 15:43
閱讀 2083·2019-08-29 13:48
閱讀 2803·2019-08-26 13:55
閱讀 2110·2019-08-23 15:09
閱讀 2905·2019-08-23 14:40
閱讀 3438·2019-08-23 14:23
閱讀 2646·2019-08-23 14:20