[转]Laravel 4之路由
Laravel 4路由是一种支持RESTful的路由体系, 基于symfony2的Routing组件构成,语法简洁明了,功能强大。关于RESTful,参考理解RESTful架构这篇文章。Laravel应用中的大多数路都会定义在app/routes.php文件中。
基本路由
最基本的Laravel路由由URI和闭包回调函数(匿名函数)组成。第二个参数可以是一个匿名函数,也可以是一个数组,用于指定过滤器或是HTTPS协议等
Route::get('my/page',function(){return'Hello world!';});
当URL以GET方式访问http://localhost/my/page时,将返回Hello world!字样。Route支持以下方法捕捉不同的HTTP动作
Route::get();Route::post();Route::put();Route::delete();Route::any();
带参数的路由
带参数的路由可以很容易将一个值通过URL传递给程序,比如
Route::get('/books/{genre}',function($genre){return"Books in the {$genre} category.";});
可选路由参数
Route::get('/books/{genre?}',function($genre =null){if($genre ==null)return'Books index.';return"Books in the {$genre} category.";});
带默认值的路由参数
Route::get('/books/{genre?}',function($genre ='Crime'){return"Books in the {$genre} category.";});
支持HTTPS的安全路由
Route::get('secret/content', array('https',function(){return'Secret squirrel!';}));
带有正则表达式约束条件的路由
Route::get('save/{princess}',function($princess){return"Sorry, {$princess} is in another castle. :(";})->where('princess','[A-Za-z]+');
多个条件限定
Route::get('save/{princess}/{unicorn}',function($princess, $unicorn){return"{$princess} loves {$unicorn}";})->where('princess','[A-Za-z]+')->where('unicorn','[0-9]+');
路由过滤器
过滤器可以在路由之前或之后进行相关的逻辑判断和动作,确保你有权限访问相应的资源。过滤器在app/filters.php中定义
// app/filters.phpRoute::filter('birthday',function(){if(date('d/m')=='16/08'){return'Happy birthday';}});
在路由前绑定过滤器
// app/routes.phpRoute::get('/', array('before'=>'birthday',function(){return'hello word!';}));
如果当天为16/08,那么输出'Happy birthday',否则输出'hello word!',一旦过滤器有返回响应,则停止路由。过滤器没有返回则路由继续。
也可以在路由后绑定过滤器
// app/routes.phpRoute::get('/', array('after'=>'birthday',function(){return'hello word!';}));
绑定多个过滤器
// app/routes.phpRoute::get('/', array('before'=>'birthday|christmas',function(){returnView::make('hello');}));
过滤器从左到右依次执行,如果有一个返回响应,则请求终止,执行返回的响应。也可以用数组的形式
// app/routes.phpRoute::get('/', array('before'=> array('birthday','christmas'),function(){returnView::make('hello');}));
过滤器参数
before过滤器的function默认两个参数,after过滤器默认为三个
// beforeRoute::filter('test',function($route, $request){});// afterRoute::filter('test',function($route, $request, $response){});
因此before过滤器的第三个参数以后为用户自定义参数,after第四个参数以后为用户自定义参数
// app/filters.phpRoute::filter('birthday',function($route, $request, $date){if(date('d/m')== $date){return'Happy birthday';}});
路由中通过过滤器名后加:号添加参数
Route::get('/', array('before'=>'birthday:16/08',function(){return'hello word!';}));
多个过滤器参数
// app/filters.phpRoute::filter('birthday',function($route, $request, $first, $second, $third){return"{$first} - {$second} - {$third}";});// app/routes.phpRoute::get('/', array('before'=>'birthday:foo,bar,baz',function(){return'hello word!';}));
过滤器类
我们可以用过滤器类代替闭包函数,方便以后测试,过滤器类可以在app/filters.php中定义,也可以放在任何地方,假设我们在/app目录下新建一个filters文件夹,专门用来放过滤器类,那么我们必须先更改composer.json文件,将新的目录添加进类自动加载'classmap'中
"autoload":{"classmap":["app/commands","app/controllers","app/models","app/filters","app/database/migrations","app/database/seeds","app/tests/TestCase.php"]}
然后创建过滤器类文件
<?php// app/filters/Birthday.phpclassBirthdayFilter{publicfunction filter($route, $request, $date='16/08'){if(date('d/m')== $date){return'Happy bitrhday';}}}
类名称没有特别约束,主要是实现filter()函数,然后注册我们的过滤器类
// app/filters.phpRoute::filter('birthday','BirthdayFilter');
然后跟路由绑定
// app/routes.phpRoute::get('/', array('before'=>'birthday',function(){return'hello word';}));
在浏览之前,需运行composer dump-autoload,更新自动加载文件,使其能找到我们创建的类。
全局过滤器
app/filters.php中有两个全局过滤器,适用于任何请求
App::before(function($request){//});App::after(function($request, $response){//});
此外app/filters.php文件中还定义了auth,auth.basic,guest,csrf四个默认过滤器
模式过滤器
可以针对一组路由绑定过滤器
// app/routes.phpRoute::when('profile/*','birthday');
或是根据HTTP动作限定过滤器
// app/routes.phpRoute::when('profile/*','birthday', array('post'));
命名路由
可以为较长较复杂的路由命名一个简单的名字,方便重定向或,生成URL
// app/routes.phpRoute::get('/my/long/calendar/route', array('as'=>'calendar',function(){return route('calendar');}));
使用路由名称来创建URL和重定向
$url = URL::route('calendar');$redirect =Redirect::route('calendar');
获取当前路由的别名
$current =Route::currentRouteName();
还可以为控制器指定路由名称
// app/routes.phpRoute::get('/my/long/calendar/route', array('as'=>'calendar','uses'=>'CalendarController@showCalendar'));
路由组
前面通过Route::when()为一组相同路由绑定过滤器,如果要为多个不同组的路由绑定,则需要路由组Route::group()
// app/routes.phpRoute::group(array('before'=>'onlybrogrammers'),function(){// First RouteRoute::get('/first',function(){return'Dude!';});// Second RouteRoute::get('/second',function(){return'Duuuuude!';});});
路由前缀
为组路由设置前缀
// app/routes.phpRoute::group(array('prefix'=>'books'),function(){// First RouteRoute::get('/first',function(){return'The Colour of Magic';});// Second RouteRoute::get('/second',function(){return'Reaper Man';});});
这样可以通过localhost/books/first形式访问
子域名路由
通过子域名的不同访问不同的资源,比如下面地址
http://myapp.dev/my/routehttp://another.myapp.dev/my/routehttp://third.myapp.dev/my/route
路由如下
// app/routes.phpRoute::group(array('domain'=>'myapp.dev'),function(){Route::get('my/route',function(){return'Hello from myapp.dev!';});});Route::group(array('domain'=>'another.myapp.dev'),function(){Route::get('my/route',function(){return'Hello from another.myapp.dev!';});});
同样,子域名里还可以传递参数
Route::group(array('domain'=>'{user}.myapp.dev'),function(){Route::get('profile/{page}',function($user, $page){// ...});});
结束
Laravel提供的路由功能不仅这些,还包括控制器路由,路由跟模型的绑定,甚至支持创建resource controllers。
[转]Laravel 4之路由的更多相关文章
- Laravel 深入理解路由和URL生成
原文地址: Laravel 深入理解路由和URL生成 在模板中我们一般不会直接写死url,而是用url助手生成url,本文介绍一下url助手的使用以及遇到的一些比较头疼的问题. 首先,我们创建了一个路 ...
- laravel基础课程---2、Laravel配置文件、路由及php artisan(php artisan是什么)
laravel基础课程---2.Laravel配置文件.路由及php artisan(php artisan是什么) 一.总结 一句话总结: PHP工具匠:php artisan,其实本身就是一些PH ...
- Laravel框架下路由的使用(源码解析)
本篇文章给大家带来的内容是关于Laravel框架下路由的使用(源码解析),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 我的解析文章并非深层次多领域的解析攻略.但是参考着开发文 ...
- laravel强大功能路由初探(二)
目标当然是先输出helloworld 配置hosts文件和apache下的httpd-vhosts.conf, hosts:127.0.0.1 www.blog.com httpd-vhosts.c ...
- Laravel学习第一天(创建laravel项目、路由、视图、blade模板)
创建laravel项目 composer create-project laravel/laravel learnlv 4.1.* 查看帮助:composer create-project 使用 ...
- laravel路由不生效,404,除了/ 都不行,关于nginx环境下laravel除了默认路由都出现404报错的处理方法
其实出现这个问题只会出现在laravel被部署在二级目录中,其原因是,除了请求根目录/ (http://www.xxx.com/public/),会请求public/index.php 你在浏览器输入 ...
- laravel 5.3 ——路由(资源,别名)
laravel的路由定义中,其中route:resoure(),可以直接定义类似restful风格的URL 例如:Route::resource('system/role','System\RoleC ...
- laravel中的路由
相信玩过laravel框架的小伙伴们,都知道它路由的强大之处 今天我想给大家分析下这个 首先 要找到配置路由的位置 routes这个目录下,我们找到web.php文件 里面可以看到现成的一个路由 Ro ...
- laravel 多控制器路由
laravel 路由: ======================================= 公司的情况很不乐观...... 破产清算随时可能发生......
随机推荐
- [RxJS] Logging a Stream with do()
To help understand your stream, you’ll almost always want to log out some the intermediate values to ...
- Bloom Filter 算法具体解释
Bloom Filter 算法 Bloom filter是由Burton Bloom 在1970年提出的,其后在P2P上得到了广泛的应用.Bloom filter 算法可用来查询某一数据是否在某一数据 ...
- My way to Python - Day04 - 模块
re模块 什么是正则表达式 正则表达式,英文叫做Regular Expression.简单说,正则表达式就是一组规则,用于实现字符串的查找,匹配,以实现关于字符串的相关操作,比如替换,删除等. 正则表 ...
- (转)AspNetPager查询分页问题(点击页码,不再是查询后的数据集)viewstate解决
public string SQL = "select * from Memorandum"; protected void Page_Load(object send ...
- 控制用户的访问之权限、角色【weber出品必属精品】
权限的作用 限制用户对数据的访问 权限的分类 1. 系统权限:能够存取数据库的权限 2. 对象权限:操作数据库对象的内容 系统权限 1.1 如何创建用户: SQL> create user t ...
- JSON转Model内部实现解析
一.思路: 1.通过模型类型获得所有的属性和其类型 2.对获得的json进行处理.类型处理 3.考虑字典键值和模型属性名不一致的情况 4.添加code用于归档 5.补充JSON转字典.字典转JSON. ...
- 用excel做一幅像素画
开发背景 看到网上有人发教程,如何通过在excel里设置单元格颜色画一幅画,感觉手工做太复杂,就打算用程序实现一个. 开发运行环境 python 2.7 PIL xlsxwriter 用法 pytho ...
- 发送trim值
发送寄存器和地址上的所有值 uart_send(0xa1); uart_send(*((char code*)0x2001)); uart_send(*((char code*)0x2002)); u ...
- c#鼠标在控件上面,然后显示文字
先添加toolTip控件到界面 然后每个控件的属性会多一项 ToolTip 第一种:直接给里面加文字 第二种: private void pictureBox_topmost_MouseHover(o ...
- unique &unique_copy
unique (ForwardIterator first, ForwardIterator last); unique (ForwardIterator first, ForwardIterat ...