资讯专栏INFORMATION COLUMN

Laravel学习笔记之Route,Middleware和Controller参数传递

zhangyucha0 / 2299人阅读

摘要:本文主要学习总结下间参数传递。开发时经常碰到类似场景有时需要在中读取中设置的和,有时也需要在中读取中设置的参数。总结下这几个知识点,便于查阅。

本文主要学习总结下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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21971.html

相关文章

  • Laravel核心解读--控制器

    摘要:下面是刚才说的这些步骤对应的核心代码收集路由和控制器里应用的中间件我们在前面的文章里已经详细的解释过中间件和路由的原理了,接下来就看看当请求最终找到了路由对应的控制器方法后是如何为控制器方法注入正确的参数并调用控制器方法的。 控制器 控制器能够将相关的请求处理逻辑组成一个单独的类, 通过前面的路由和中间件两个章节我们多次强调Laravel应用的请求在进入应用后首现会通过Http Ker...

    fxp 评论0 收藏0
  • Laravel源码解析路由的使用

    摘要:入口启动后,会先加载服务提供者中间件等组件,在查找路由之前因为我们使用的是门面,所以先要查到的实体类。注册第一步当然还是通过服务提供者,因为这是启动的关键,在内加载路由文件。因路由文件中没有命名空间。 showImg(https://segmentfault.com/img/bVbhjvY?w=600&h=296); 前言 我的解析文章并非深层次多领域的解析攻略。但是参考着开发文档看此...

    MartinDai 评论0 收藏0
  • laravel框架应用composer扩展包开发

    摘要:官方地址是目前最流行的框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,框架思想前卫,跟随时代潮流,提倡优雅代码,自称为工匠,其中的模板引擎容器以及扩展包为业务的开发提供了极大的便利。 laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,lara...

    shevy 评论0 收藏0
  • Laravel核心解读--中间件(Middleware)

    摘要:解析出后将进入应用的请求对象传递给的方法,在方法负责处理流入应用的请求对象并返回响应对象。携带了本次迭代的值。通过这种方式让请求对象依次流过了要通过的中间件,达到目的地的方法。 中间件(Middleware)在Laravel中起着过滤进入应用的HTTP请求对象(Request)和完善离开应用的HTTP响应对象(Reponse)的作用, 而且可以通过应用多个中间件来层层过滤请求、逐步完善...

    enda 评论0 收藏0
  • illuminate/routing 源码分析注册路由

    摘要:本文将会源码分析下是如何把开发者在中写的路由列表注册到对象内的。通过以上的分析,就能对路由系统的基本设计越来越清晰。一个进来后,首先开始启动并按照以上逻辑开始注册路由列表,然后就是根据当前信息查找对应的对象。 我们知道,在 Laravel 世界里,外界传进来一个 Request 时,会被 Kernel 处理并返回给外界一个 Response。Kernel 在处理 Request 时,会...

    seal_de 评论0 收藏0

发表评论

0条评论

zhangyucha0

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<