Laravel中路由怎么写(二)
1、路由命名——给路由起个名字
1.1 基本使用
我们使用as关键字来为路由命名:
Route::get('/hello/Laravel',['as'=>'academy',function(){
return 'Hello Laravel!';
}]);
路由命名可以让我们在使用route函数生成指向该路由的URL或者生成跳转到该路由的重定向链接时更加方便:
Route::get('/testNamedRoute',function(){
return route('academy');
});
我们在浏览器中访问http://laravel.app:8000/testNamedRoute时输出http://laravel.app:8000/hello/Laravel,然后我们修改上述闭包内代码:
Route::get('/testNamedRoute',function(){
return redirect()->route('academy');
});
再次在浏览器中访问http://laravel.app:8000/testNamedRoute时会跳转到http://laravel.app:8000/hello/Laravel。
我们甚至还可以在使用带参数的路由命名:
Route::get('/hello/Laravel/{id}',['as'=>'academy',function($id){
return 'Hello Laravel '.$id.'!';
}]);
对应的测试路由定义如下:
Route::get('/testNamedRoute',function(){
return redirect()->route('academy',['id'=>1]);
});
这样,当我们在浏览器中访问http://laravel.app:8000/testNamedRoute时会跳转到http://laravel.app:8000/hello/Laravel/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/Laravel',function(){
//使用Test中间件
});
Route::get('/update/Laravel',function(){
//使用Test中间件
});
});
Route::get('/age/refuse',['as'=>'refuse',function(){
return "未成年人禁止入内!";
}]);
这样当我们在浏览器中访问http://laravel.app:8000/write/Laravel?age=15或者http://laravel.app:8000/update/Laravel?age=15时就会跳转到http://laravel.app:8000/age/refuse,并显示:
未成年人禁止入内!
2.2 命名空间
默认情况下,routes.php中的定义的控制器位于App\Http\Controllers命名空间下,所以如果要指定命名空间,只需指定App\Http\Controllers之后的部分即可:
Route::group(['namespace' => 'Laravel'], function(){
// 控制器在 "App\Http\Controllers\Laravel" 命名空间下
Route::group(['namespace' => 'DOCS'], function()
{
// 控制器在 "App\Http\Controllers\Laravel\DOCS" 命名空间下
});
});
2.3 子域名
子域名可以通过domain关键字来设置:
Route::group(['domain'=>'{service}.laravel.app'],function(){
Route::get('/write/Laravel',function($service){
return "Write FROM {$service}.laravel.app";
});
Route::get('/update/Laravel',function($service){
return "Update FROM {$service}.laravel.app";
});
});
这样我们在浏览器中访问http://write.laravel.app:8000/write/Laravel,则输出
Write FROM write.laravel.app
访问http://update.laravel.app:8000/write/Laravel时,则输出:
Write FROM update.laravel.app
注意:要想让子域名解析生效,需要在hosts中绑定IP地址
2.4 路由前缀
如果路由群组中的所有路由包含统一前缀,则我们可以通过在group方法中设置prefix属性来指定该前缀:
Route::group(['prefix'=>'Laravel'],function(){
Route::get('write',function(){
return "Write Laravel";
});
Route::get('update',function(){
return "Update Laravel";
});
});
这样我们就可以通过http://laravel.app:8000/Laravel/write或者http://laravel.app:8000/Laravel/update来访问对应的操作。
我们甚至还可以在路由前缀中指定参数:
Route::group(['prefix'=>'Laravel/{version}'],function(){
Route::get('write',function($version){
return "Write Laravel {$version}";
});
Route::get('update',function($version){
return "Update Laravel {$version}";
});
});
这样我们在浏览器中访问http://laravel.app:8000/Laravel/5.1/write,则对应会输出:
Write Laravel 5.1
Laravel中路由怎么写(二)的更多相关文章
- Laravel中路由怎么写(一)
1.路由基本使用示例 1.1 默认示例 Laravel中所有路由定义在/app/Http/routes.php文件中,该文件默认定义了应用的首页路由: Route::get('/', function ...
- Laravel中使用QRcode自制二维码
一.配置 1.在项目根目录输入命令 composer require simplesoftwareio/simple-qrcode 1.3.* 2.在config/app.php 的 provider ...
- laravel 中路由的快速设置(只需一个控制器名就ok) 不用具体到方法
routes/web.php 设置路由 Route::group(['middleware' => ['\iqiyi\Http\Middleware\VerifyCsrfToken::class ...
- [2018-01-12] laravel中的MVC
路由里面可以做所有事情,但是真正的项目当中,路由只用来接收请求,并转发给控制器的方法进行处理 首先我们先了解一下 一.app/Http/routes路由的用法: 方法一. 这种方法写完后在控制器创建方 ...
- laravel中如何利用反射实现依赖注入
依赖注入 在一个类中经常会依赖于其他的对象,先看一下经典的写法 class Foo { public $bar; public function __construct() { $this->b ...
- laravel基础课程---3、路由(Laravel中的常见路由有哪几种)
laravel基础课程---3.路由(Laravel中的常见路由有哪几种) 一.总结 一句话总结: 6种:post,get,put,patch,delete,options Route::get($u ...
- Laravel中构造方法中不能写return!!!
今天遇到的大坑 在laravel中 __construct 这个方法中不能写return 完全不能返回 而且还会向下执行具体原因不知道为什么解决办法!!!!用中间件来实现就可以了 Over!!!
- flask 中使用蓝图将路由分开写在不同文件
flask 若想将不同的路由写在不同的文件中(如将 user 对象的相关接口写在一个文件中,将 customer 对象的相关接口写在另一个文件中),可以使用蓝图来实现. 有关蓝图的定义:A Bluep ...
- Laravel 中使用 swoole 项目实战开发案例二 (后端主动分场景给界面推送消息)
推荐阅读:Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信) 需求分析 我们假设有一个需求,我在后端点击按钮 1,首页弹出 “后端触发了按钮 1”.后端点了 ...
随机推荐
- linux环境变量配置,转载地址:http://blog.sina.com.cn/rss/1650981242.xml
学习总结 1.Linux的变量种类按变量的生存周期来划分,Linux变量可分为两类:1. 永久的:需要修改配置文件,变量永久生效.2. 临时的:使用export命令行声明即可,变量在关 ...
- js arrayBuffer 字节序问题,小端法,大端法
原文博客 { var buffer = new ArrayBuffer(2) var bytes = new Uint16Array(buffer) bytes[0] = (65 << 8 ...
- 微软VBS生成Excel内容和图表示例
<HTML> <BODY> <INPUT id=button1 name=button1 type=button value=Button> <SCRIPT ...
- db2 表空间扩容
DB2表空间扩容 1 - Detect what tablespace has size issues db2 list tablespaces show detail 2 - Check the p ...
- 没有上司的舞会|codevs1380|luoguP1352|树形DP|Elena
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系 ...
- select cast(round(12.5,2) as numeric(5,2))
http://www.jb51.net/article/74284.htm 解释: round()函数,是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置小数四舍五入的精度. )--32. ...
- [No000010D]Git6/9-分支管理
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...
- 今天重装系统后,Windows更新提示“windows update当前无法检查更新,因为未运行服务。您可能需要重新启动计算机”
到百度搜了常用的解决方法,就是用命令提示符,但对我的情况不管用,提示“拒绝访问”.后来在08绿软站的一篇文章中找到了解决办法.原文如下(我本人也是用的第四种方法解决的): 试了下面几种解决方法,第四种 ...
- 2015年蓝桥杯省赛A组c++第4题
/* StringInGrid函数会在一个指定大小的格子中打印指定的字符串. 要求字符串在水平.垂直两个方向上都居中. 如果字符串太长,就截断. 如果不能恰好居中,可以稍稍偏左或者偏上一点. 下面的程 ...
- c# List获取重复项
List<Test> t = new List<Test>() { ,name="车辆"}, ,name="车辆"}, ,name=&q ...