成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel學(xué)習(xí)筆記之Route,Middleware和Controller參數(shù)傳遞

zhangyucha0 / 2427人閱讀

摘要:本文主要學(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

相關(guān)文章

  • Laravel核心解讀--控制器

    摘要:下面是剛才說的這些步驟對應(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...

    fxp 評論0 收藏0
  • Laravel源碼解析路由的使用

    摘要:入口啟動后,會先加載服務(wù)提供者中間件等組件,在查找路由之前因為我們使用的是門面,所以先要查到的實體類。注冊第一步當(dāng)然還是通過服務(wù)提供者,因為這是啟動的關(guān)鍵,在內(nèi)加載路由文件。因路由文件中沒有命名空間。 showImg(https://segmentfault.com/img/bVbhjvY?w=600&h=296); 前言 我的解析文章并非深層次多領(lǐng)域的解析攻略。但是參考著開發(fā)文檔看此...

    MartinDai 評論0 收藏0
  • laravel框架應(yīng)用composer擴展包開發(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...

    shevy 評論0 收藏0
  • Laravel核心解讀--中間件(Middleware)

    摘要:解析出后將進入應(yīng)用的請求對象傳遞給的方法,在方法負責(zé)處理流入應(yīng)用的請求對象并返回響應(yīng)對象。攜帶了本次迭代的值。通過這種方式讓請求對象依次流過了要通過的中間件,達到目的地的方法。 中間件(Middleware)在Laravel中起著過濾進入應(yīng)用的HTTP請求對象(Request)和完善離開應(yīng)用的HTTP響應(yīng)對象(Reponse)的作用, 而且可以通過應(yīng)用多個中間件來層層過濾請求、逐步完善...

    enda 評論0 收藏0
  • illuminate/routing 源碼分析注冊路由

    摘要:本文將會源碼分析下是如何把開發(fā)者在中寫的路由列表注冊到對象內(nèi)的。通過以上的分析,就能對路由系統(tǒng)的基本設(shè)計越來越清晰。一個進來后,首先開始啟動并按照以上邏輯開始注冊路由列表,然后就是根據(jù)當(dāng)前信息查找對應(yīng)的對象。 我們知道,在 Laravel 世界里,外界傳進來一個 Request 時,會被 Kernel 處理并返回給外界一個 Response。Kernel 在處理 Request 時,會...

    seal_de 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<