Laravel HTTP路由命名和路由分组例子

1、路由命名——给路由起个名字

1.1 基本使用

我们使用as关键字来为路由命名:

Route::get('/hello/laravelacademy',['as'=>'academy',function(){
    return 'Hello LaravelAcademy!';
}]);

路由命名可以让我们在使用route函数生成指向该路由的URL或者生成跳转到该路由的重定向链接时更加方便:

Route::get('/testNamedRoute',function(){
   return route('academy');
});
我们在浏览器中访问http://laravel.app:8000/testNamedRoute时输出http://laravel.app:8000/hello/laravelacademy,然后我们修改上述闭包内代码:

Route::get('/testNamedRoute',function(){
    return redirect()->route('academy');
});

再次在浏览器中访问http://laravel.app:8000/testNamedRoute时会跳转到http://laravel.app:8000/hello/laravelacademy。

我们甚至还可以在使用带参数的路由命名:

Route::get('/hello/laravelacademy/{id}',['as'=>'academy',function($id){
    return 'Hello LaravelAcademy '.$id.'!';
}]);
对应的测试路由定义如下:

Route::get('/testNamedRoute',function(){
    return redirect()->route('academy',['id'=>1]);
});

这样,当我们在浏览器中访问http://laravel.app:8000/testNamedRoute时会跳转到http://laravel.app:8000/hello/laravelacademy/1

1.2 路由分组时路由命名方式

再来看一个更复杂的例子,使用路由分组时如何定义路由命名?官网文档提供的例子如下:

Route::group(['as' => 'admin::'], function () {
    Route::get('dashboard', ['as' => 'dashboard', function () {
        //
    }]);
});
在Route门面的group方法中使用一个as关键字来指定该路由群组中所有路由的公共前缀,然后再在里面每个路由中使用as关键字为该路由命名。

这样我们可以通过如下方式来生成该路由URL:

Route::get('/testNamedRoute',function(){
    return route('admin::dashboard');
});

2、路由分组

路由分组就是将一组拥有相同属性(中间件、命名空间、子域名、路由前缀等)的路由使用Route门面的group方法聚合起来。

2.1 中间件

首先我们在应用根目录下运行如下Artisan命令生成一个测试用的中间件TestMiddleware:

php artisan make:middleware TestMiddleware
这样会在/app/Http/Middleware目录下生成一个TestMiddleware.php文件,打开该文件编辑TestMiddleware类的handle方法如下:

public function handle($request, Closure $next)
{
    if($request->input('age')<18)
        return redirect()->route('refuse');
    return $next($request);
}
我们在中间件中定义这段业务逻辑的目的是年龄18岁以下的未成年人不能访问。

然后我们打开/app/Http/Kernal.php文件,新增TestMiddleware到Kernel的$routeMiddleware属性:

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'test' => \App\Http\Middleware\TestMiddleware::class,
];
接下来我们在routes.php中定义路由如下:

Route::group(['middleware'=>'test'],function(){
    Route::get('/write/laravelacademy',function(){
        //使用Test中间件
    });
    Route::get('/update/laravelacademy',function(){
       //使用Test中间件
    });
});

Route::get('/age/refuse',['as'=>'refuse',function(){
    return "未成年人禁止入内!";
}]);
这样当我们在浏览器中访问http://laravel.app:8000/write/laravelacademy?age=15或者http://laravel.app:8000/update/laravelacademy?age=15时就会跳转到http://laravel.app:8000/age/refuse,并显示:

未成年人禁止入内!

2.2 命名空间

默认情况下,routes.php中的定义的控制器位于App\Http\Controllers命名空间下,所以如果要指定命名空间,只需指定App\Http\Controllers之后的部分即可:

Route::group(['namespace' => 'LaravelAcademy'], function(){
    // 控制器在 "App\Http\Controllers\LaravelAcademy" 命名空间下

    Route::group(['namespace' => 'DOCS'], function()
    {
        // 控制器在 "App\Http\Controllers\LaravelAcademy\DOCS" 命名空间下
    });
});

2.3 子域名

子域名可以通过domain关键字来设置:

Route::group(['domain'=>'{service}.laravel.app'],function(){
    Route::get('/write/laravelacademy',function($service){
        return "Write FROM {$service}.laravel.app";
    });
    Route::get('/update/laravelacademy',function($service){
        return "Update FROM {$service}.laravel.app";
    });
});
这样我们在浏览器中访问http://write.laravel.app:8000/write/laravelacademy,则输出

Write FROM write.laravel.app
访问http://update.laravel.app:8000/write/laravelacademy时,则输出:

Write FROM update.laravel.app
注意:要想让子域名解析生效,需要在hosts中绑定IP地址

2.4 路由前缀

如果路由群组中的所有路由包含统一前缀,则我们可以通过在group方法中设置prefix属性来指定该前缀:

Route::group(['prefix'=>'laravelacademy'],function(){
    Route::get('write',function(){
        return "Write LaravelAcademy";
    });
    Route::get('update',function(){
        return "Update LaravelAcademy";
    });
});

这样我们就可以通过http://laravel.app:8000/laravelacademy/write或者http://laravel.app:8000/laravelacademy/update来访问对应的操作。

我们甚至还可以在路由前缀中指定参数:

Route::group(['prefix'=>'laravelacademy/{version}'],function(){
    Route::get('write',function($version){
        return "Write LaravelAcademy {$version}";
    });
    Route::get('update',function($version){
        return "Update LaravelAcademy {$version}";
    });
});
这样我们在浏览器中访问http://laravel.app:8000/laravelacademy/5.1/write,则对应会输出:

Write LaravelAcademy 5.1

时间: 2024-08-31 12:53:14

Laravel HTTP路由命名和路由分组例子的相关文章

静态路由与默认路由的原理、区别和实例

静态路由 静态路由的概念 (1) 最为原始的配置路由方式,纯手工,易管理,但是耗时,一般用于小型企业或者中等偏下型企业 (2)静态路由的缺点是不能动态反映网络拓扑,当网络拓扑发生变化时,管理员必须手工改变路由表: (3)静态路由不会占用路由器太多的CPU和RAM资源,也不占用线路的带宽.如果出于安全的考虑想隐藏网络的某些部分或者管理员想控制数据转发路径,也会使用静态路由. (4)在一个小而简单的网络中,也常常使用静态路由,因为配置静态路由会更为简洁. 静态路由的配置: ip router 目的网

思科模拟器静态路由和动态路由配置

思科模拟器 静态路由,动态路由 RIP配置 动态路由协议 RIP 命令就两行比较简单 实验拓扑图如下: 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Network/lyjs/ 要想实现pc1 和pc2 通讯就要对R1 ,R2,R3 进行配置 1. 静态配置命令格式如下: 对于R1 Router>en Router#conf Configuring from terminal, memory, or network [terminal]?

通过VRRP实现路由备份与路由分流

VRRP(Virtual Router Redundancy Protocol)是一种容错协议.通常,一个网络内的主机设置一条缺省路由,这样,主机发出的目的地址不在本网段的报文将通过缺省路由发往路由器Router,从而实现了主机与外部网络的通信.当路由器Router发生故障时,本网段内所有以Router为缺省路由下一跳的主机将断掉与外部的通信. VRRP就是为解决上述问题而提出的,它为具有多播或广播能力的局域网(如:以太网)设计.VRRP将局域网的一组路由器(包括一个MASTER和若干个BACK

华为vlan划分,单臂路由以及静态路由

华为vlan划分,单臂路由以及静态路由使所有成员都能上网 华为拓扑图: IP地址规划如图! IP地址 VLAN 划分: <Huawei>sy         进入视图模式 [Huawei]un in en      关闭消息中心 [Huawei]sysname SW1      改交换机名字 [SW1]inter vlan 1       进入交换机 [SW1-Vlanif1]ip address 192.168.0.10 24   配ip地址 [SW1-Vlanif1]un shut    

html5-angular路由配置问题,路由注入失败

问题描述 angular路由配置问题,路由注入失败 var myApp = angular.module('myApp', ['ngRoute']); myApp.config(['$routeProvider', function($routeProvider) { $routeProvider. when('/business', { templateUrl: 'admin/business.html', controller: 'businessController' }). when('

Angular路由与Nodejs路由的区别

转自:http://www.imooc.com/qadetail/114683?t=148182 觉得angualr.js的路由是针对于单页面的路由,每次路由发生变化,只是页面的状态发生变化,页面本身没有发生跳转 express的路由是针对多页面的,也就是说他做的页面,路由的切换是伴随着页面的切换 所以建议页面内部的路由变化使用angular.js 的router,而页面间的路由用express 经过我自己的实践,我终于在express环境中把angular跑起来了,简直是哔了狗,俺够啦. 首先

ASP.NET Core的路由[2]:路由系统的核心对象——Router

ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流程使用.但是具体的路由解析功能其实并没有直接实现在RouterMiddleware中间件中,而是由一个Router对象来完成的.[本文已经同步到<ASP.NET Core框架揭秘>之中] 目录 一.IRouter接口 二.RouteContext 三.RouteData 四.Route 五.Rou

《IP路由协议疑难解析》一1.2 静态路由和动态路由

1.2 静态路由和动态路由 IP路由协议疑难解析可在路由器上手工(静态)设定(用来转发数据包的)路径信息(即静态路由),迫使路由器通过某特定端口或下一跳IP地址,转发匹配(静态路由中所包含的)目的IP地址的数据包.可设置静态路由,来匹配"各式各样"的目的IP网络地址.还有一种让路由器获取路由信息的手段,那就是在其上运行分布式的应用程序,来自动收集,并在路由器间彼此共享路由信息.此类分布式应用程序不仅能自动收集路由信息,还能实时跟踪网络连通性状态,并会尽量提供实时而又有效的路由信息,故称

智能路由PK传统路由:下一个“颠覆者”是它吗?

序一大波智能路由器来袭互联网与传统行业碰撞的频率似乎正在加快.在智能手机.智能电视两个领域创下不小的声势后,家用路由器成为了中国互联网公司的新目标.作为家庭网络枢纽,路由器一直扮演着简单而重要的工作--让PC.手机和平板电脑顺利接入互联网.在传统路由器的时代里,价格.品牌.穿透性和覆盖性.网络速率--这些内容是用户选择购买产品的关键要素.出来没有人想过要用互联网思维去改造这个小小的盒子,因为它本来就是互联网的一份子.然后带着野心和梦想,智能路由器来了. 它们试图说服每一个家庭互联网的参与者:我们