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