文档章节

Laravel5.3之Route,Middleware和Controller参数传递

botkenni
 botkenni
发布于 2016/11/19 10:40
字数 650
阅读 40
收藏 0

本文主要学习总结下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 App\Http\Controllers\RouteParameter;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class RouteParameterToMiddlewareController extends Controller
{
    public function show($user, $role)
    {
        
    }
}


namespace App\Http\Controllers\RouteParameter;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class MiddlewareParameterToMiddlewareController extends Controller
{
    public function index()
    {
        return 'All';
    }
}

并且在Kernel.php中注册中间件:

$routeMiddlewares = []
    ...
    
    'route.parameter'       => \App\Http\Middleware\RouteParameter::class,
    'middleware.parameter'  => \App\Http\Middleware\MiddlewareParameter::class,
    'middleware.controller' => \App\Http\Middleware\ControllerParameter::class,
;

Passing Route Parameters to Middleware

在中间件route.parameter中读取路由参数有三种方式:$request->route($parameter_name);$request->route()->parameter($parameter_name);$request->route()->parameters(),代码如下:

<?php

namespace App\Http\Middleware;

use Closure;

class RouteParameter
{
    /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */
    public function handle($request, Closure $next)
    {
        // or $user = $request->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 App\Http\Middleware;

use Auth;
use Closure;
use Illuminate\Http\Response;

class MiddlewareParameter
{
    /** * Handle an incoming request. * * @param \Illuminate\Http\Request $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 App\Http\Middleware;

use Closure;

class ControllerParameter
{
    /** * Handle an incoming request. * * @param \Illuminate\Http\Request $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 App\Http\Controllers\RouteParameter;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class MiddlewareToController extends Controller
{
    public function index(Request $request)
    {
        dd($request->get('role'));
    }
}

总结:Route,Middleware,Controller之间传递参数这个知识点会经常在设计代码时用到,还有从Route中传递参数到Controller中,这个就更是经常要用到的,也简单。总结下这几个知识点,便于查阅。

© 著作权归作者所有

共有 人打赏支持
botkenni
粉丝 17
博文 405
码字总数 433796
作品 0
西城
程序员
Laravel5.3之Middleware源码解析

说明:本文主要学习Laravel的Middleware的源码设计思想,并将学习心得分享出来,希望对别人有所帮助。Laravel5.3之Decorator Pattern已经聊过Laravel使用了Decorator Pattern来设计Middlewar...

botkenni
2016/10/27
37
0
laravel5.2的新功能

上一节课我们学了laravel5.3的新特性 https://my.oschina.net/lilugirl2005/blog/787478 这节课主要讲一些laravel5.2的新特性在laravel5.3的基础上演示 我们还是以10yue.live网站为例 larave...

lilugirl
2016/11/16
21
0
Swoole 分布式通讯框架 SwooleDistributed 2.6 正式版发布

SwooleDistributed2.6正式版发布 本次发布的版本包含几个重大功能更新。 1.中间件模块 SD框架引入了中间件过程,消息的传递流程如下。 message->pack->middleware1(before)->middleware2(be...

白_猫
2017/10/18
1K
1
Laravel5.3之bootstrap源码解析

说明:Laravel在把Request通过送入中间件Middleware和路由Router之前,还做了程序的启动Bootstrap工作,本文主要学习相关源码,看看Laravel启动程序做了哪些具体工作,并将个人的研究心得分享...

botkenni
2016/10/28
363
0
Laravel5.3之Decorator Pattern

说明:Laravel中Middleware的实现主要利用了Decorator Pattern的设计,本文主要先学习下Decorator Pattern如何实现,为后面学习Middleware的设计做个铺垫。Decorator Pattern和Adapter Patte...

botkenni
2016/10/27
5
0

没有更多内容

加载失败,请刷新页面

加载更多

创建第一个react项目

sudo npm i -g create-react-app@1.5.2 create-react-app react-app cd react-apprm -rf package-lock.jsonrm -rf node_modules #主要是为了避免报错npm installnpm start......

lilugirl
今天
3
0
在浏览器中进行深度学习:TensorFlow.js (八)生成对抗网络 (GAN)

Generative Adversarial Network 是深度学习中非常有趣的一种方法。GAN最早源自Ian Goodfellow的这篇论文。LeCun对GAN给出了极高的评价: “There are many interesting recent development...

naughty
今天
0
0
搬瓦工镜像站bwh1.net被DNS污染,国内打不开搬瓦工官网

今天下午(2018年10月17日),继搬瓦工主域名bandwagonhost.com被污染后,这个国内的镜像地址bwh1.net也被墙了。那么目前应该怎么访问搬瓦工官网呢? 消息来源:搬瓦工优惠网->搬瓦工镜像站b...

flyzy2005
今天
9
0
SpringBoot自动配置

本篇介绍下,如何通过springboot的自动配置,将公司项目内的依赖jar,不需要扫描路径,依赖jar的情况下,就能将jar内配置了@configuration注解的类,创建到IOC里面 介绍下开发环境 JDK版本1.8 spr...

贺小五
今天
5
0
命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部