Laravel 4之路由

Laravel 4路由是一种支持RESTful的路由体系, 基于symfony2的Routing组件构成,语法简洁明了,功能强大。关于RESTful,参考理解RESTful架构这篇文章。Laravel应用中的大多数路都会定义在app/routes.php文件中。

基本路由

最基本的Laravel路由由URI和闭包回调函数(匿名函数)组成。第二个参数可以是一个匿名函数,也可以是一个数组,用于指定过滤器或是HTTPS协议等

  1. Route::get('my/page',function(){
  2. return'Hello world!';
  3. });

当URL以GET方式访问http://localhost/my/page时,将返回Hello world!字样。Route支持以下方法捕捉不同的HTTP动作

  1. Route::get();
  2. Route::post();
  3. Route::put();
  4. Route::delete();
  5. Route::any();

带参数的路由

带参数的路由可以很容易将一个值通过URL传递给程序,比如

  1. Route::get('/books/{genre}',function($genre)
  2. {
  3. return"Books in the {$genre} category.";
  4. });

可选路由参数

  1. Route::get('/books/{genre?}',function($genre =null)
  2. {
  3. if($genre ==null)return'Books index.';
  4. return"Books in the {$genre} category.";
  5. });

带默认值的路由参数

  1. Route::get('/books/{genre?}',function($genre ='Crime')
  2. {
  3. return"Books in the {$genre} category.";
  4. });

支持HTTPS的安全路由

  1. Route::get('secret/content', array(
  2. 'https',
  3. function(){
  4. return'Secret squirrel!';
  5. }
  6. ));

带有正则表达式约束条件的路由

  1. Route::get('save/{princess}',function($princess)
  2. {
  3. return"Sorry, {$princess} is in another castle. :(";
  4. })->where('princess','[A-Za-z]+');

多个条件限定

  1. Route::get('save/{princess}/{unicorn}',function($princess, $unicorn)
  2. {
  3. return"{$princess} loves {$unicorn}";
  4. })->where('princess','[A-Za-z]+')
  5. ->where('unicorn','[0-9]+');

路由过滤器

过滤器可以在路由之前或之后进行相关的逻辑判断和动作,确保你有权限访问相应的资源。过滤器在app/filters.php中定义

  1. // app/filters.php
  2. Route::filter('birthday',function()
  3. {
  4. if(date('d/m')=='16/08'){
  5. return'Happy birthday';
  6. }
  7. });

在路由前绑定过滤器

  1. // app/routes.php
  2. Route::get('/', array(
  3. 'before'=>'birthday',
  4. function()
  5. {
  6. return'hello word!';
  7. }
  8. ));

如果当天为16/08,那么输出'Happy birthday',否则输出'hello word!',一旦过滤器有返回响应,则停止路由。过滤器没有返回则路由继续。

也可以在路由后绑定过滤器

  1. // app/routes.php
  2. Route::get('/', array(
  3. 'after'=>'birthday',
  4. function()
  5. {
  6. return'hello word!';
  7. }
  8. ));

绑定多个过滤器

  1. // app/routes.php
  2. Route::get('/', array(
  3. 'before'=>'birthday|christmas',
  4. function()
  5. {
  6. returnView::make('hello');
  7. }
  8. ));

过滤器从左到右依次执行,如果有一个返回响应,则请求终止,执行返回的响应。也可以用数组的形式

  1. // app/routes.php
  2. Route::get('/', array(
  3. 'before'=> array('birthday','christmas'),
  4. function()
  5. {
  6. returnView::make('hello');
  7. }
  8. ));

过滤器参数

before过滤器的function默认两个参数,after过滤器默认为三个

  1. // before
  2. Route::filter('test',function($route, $request)
  3. {
  4. });
  5. // after
  6. Route::filter('test',function($route, $request, $response)
  7. {
  8. });

因此before过滤器的第三个参数以后为用户自定义参数,after第四个参数以后为用户自定义参数

  1. // app/filters.php
  2. Route::filter('birthday',function($route, $request, $date)
  3. {
  4. if(date('d/m')== $date){
  5. return'Happy birthday';
  6. }
  7. });

路由中通过过滤器名后加:号添加参数

  1. Route::get('/', array(
  2. 'before'=>'birthday:16/08',
  3. function()
  4. {
  5. return'hello word!';
  6. }
  7. ));

多个过滤器参数

  1. // app/filters.php
  2. Route::filter('birthday',function($route, $request, $first, $second, $third)
  3. {
  4. return"{$first} - {$second} - {$third}";
  5. });
  6. // app/routes.php
  7. Route::get('/', array(
  8. 'before'=>'birthday:foo,bar,baz',
  9. function()
  10. {
  11. return'hello word!';
  12. }
  13. ));

过滤器类

我们可以用过滤器类代替闭包函数,方便以后测试,过滤器类可以在app/filters.php中定义,也可以放在任何地方,假设我们在/app目录下新建一个filters文件夹,专门用来放过滤器类,那么我们必须先更改composer.json文件,将新的目录添加进类自动加载'classmap'中

  1. "autoload":{
  2. "classmap":[
  3. "app/commands",
  4. "app/controllers",
  5. "app/models",
  6. "app/filters",
  7. "app/database/migrations",
  8. "app/database/seeds",
  9. "app/tests/TestCase.php"
  10. ]
  11. }

然后创建过滤器类文件

  1. <?php
  2. // app/filters/Birthday.php
  3. classBirthdayFilter
  4. {
  5. publicfunction filter($route, $request, $date='16/08')
  6. {
  7. if(date('d/m')== $date){
  8. return'Happy bitrhday';
  9. }
  10. }
  11. }

类名称没有特别约束,主要是实现filter()函数,然后注册我们的过滤器类

  1. // app/filters.php
  2. Route::filter('birthday','BirthdayFilter');

然后跟路由绑定

  1. // app/routes.php
  2. Route::get('/', array(
  3. 'before'=>'birthday',
  4. function()
  5. {
  6. return'hello word';
  7. }
  8. ));

在浏览之前,需运行composer dump-autoload,更新自动加载文件,使其能找到我们创建的类。

全局过滤器

app/filters.php中有两个全局过滤器,适用于任何请求

  1. App::before(function($request)
  2. {
  3. //
  4. });
  5. App::after(function($request, $response)
  6. {
  7. //
  8. });

此外app/filters.php文件中还定义了auth,auth.basic,guest,csrf四个默认过滤器

模式过滤器

可以针对一组路由绑定过滤器

  1. // app/routes.php
  2. Route::when('profile/*','birthday');

或是根据HTTP动作限定过滤器

  1. // app/routes.php
  2. Route::when('profile/*','birthday', array('post'));

命名路由

可以为较长较复杂的路由命名一个简单的名字,方便重定向或,生成URL

  1. // app/routes.php
  2. Route::get('/my/long/calendar/route', array(
  3. 'as'=>'calendar',
  4. function(){
  5. return route('calendar');
  6. }
  7. ));

使用路由名称来创建URL和重定向

  1. $url = URL::route('calendar');
  2. $redirect =Redirect::route('calendar');

获取当前路由的别名

  1. $current =Route::currentRouteName();

还可以为控制器指定路由名称

  1. // app/routes.php
  2. Route::get('/my/long/calendar/route', array(
  3. 'as'=>'calendar',
  4. 'uses'=>'CalendarController@showCalendar'
  5. ));

路由组

前面通过Route::when()为一组相同路由绑定过滤器,如果要为多个不同组的路由绑定,则需要路由组Route::group()

  1. // app/routes.php
  2. Route::group(array('before'=>'onlybrogrammers'),function()
  3. {
  4. // First Route
  5. Route::get('/first',function(){
  6. return'Dude!';
  7. });
  8. // Second Route
  9. Route::get('/second',function(){
  10. return'Duuuuude!';
  11. });
  12. });

路由前缀

为组路由设置前缀

  1. // app/routes.php
  2. Route::group(array('prefix'=>'books'),function()
  3. {
  4. // First Route
  5. Route::get('/first',function(){
  6. return'The Colour of Magic';
  7. });
  8. // Second Route
  9. Route::get('/second',function(){
  10. return'Reaper Man';
  11. });
  12. });

这样可以通过localhost/books/first形式访问

子域名路由

通过子域名的不同访问不同的资源,比如下面地址

  1. http://myapp.dev/my/route
  2. http://another.myapp.dev/my/route
  3. http://third.myapp.dev/my/route

路由如下

  1. // app/routes.php
  2. Route::group(array('domain'=>'myapp.dev'),function()
  3. {
  4. Route::get('my/route',function(){
  5. return'Hello from myapp.dev!';
  6. });
  7. });
  8. Route::group(array('domain'=>'another.myapp.dev'),function()
  9. {
  10. Route::get('my/route',function(){
  11. return'Hello from another.myapp.dev!';
  12. });
  13. });

同样,子域名里还可以传递参数

  1. Route::group(array('domain'=>'{user}.myapp.dev'),function()
  2. {
  3. Route::get('profile/{page}',function($user, $page){
  4. // ...
  5. });
  6. });

结束

Laravel提供的路由功能不仅这些,还包括控制器路由,路由跟模型的绑定,甚至支持创建resource controllers。

[转]Laravel 4之路由的更多相关文章

  1. Laravel 深入理解路由和URL生成

    原文地址: Laravel 深入理解路由和URL生成 在模板中我们一般不会直接写死url,而是用url助手生成url,本文介绍一下url助手的使用以及遇到的一些比较头疼的问题. 首先,我们创建了一个路 ...

  2. laravel基础课程---2、Laravel配置文件、路由及php artisan(php artisan是什么)

    laravel基础课程---2.Laravel配置文件.路由及php artisan(php artisan是什么) 一.总结 一句话总结: PHP工具匠:php artisan,其实本身就是一些PH ...

  3. Laravel框架下路由的使用(源码解析)

    本篇文章给大家带来的内容是关于Laravel框架下路由的使用(源码解析),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 我的解析文章并非深层次多领域的解析攻略.但是参考着开发文 ...

  4. laravel强大功能路由初探(二)

    目标当然是先输出helloworld 配置hosts文件和apache下的httpd-vhosts.conf, hosts:127.0.0.1  www.blog.com httpd-vhosts.c ...

  5. Laravel学习第一天(创建laravel项目、路由、视图、blade模板)

    创建laravel项目 composer create-project laravel/laravel learnlv 4.1.* 查看帮助:composer create-project    使用 ...

  6. laravel路由不生效,404,除了/ 都不行,关于nginx环境下laravel除了默认路由都出现404报错的处理方法

    其实出现这个问题只会出现在laravel被部署在二级目录中,其原因是,除了请求根目录/ (http://www.xxx.com/public/),会请求public/index.php 你在浏览器输入 ...

  7. laravel 5.3 ——路由(资源,别名)

    laravel的路由定义中,其中route:resoure(),可以直接定义类似restful风格的URL 例如:Route::resource('system/role','System\RoleC ...

  8. laravel中的路由

    相信玩过laravel框架的小伙伴们,都知道它路由的强大之处 今天我想给大家分析下这个 首先 要找到配置路由的位置 routes这个目录下,我们找到web.php文件 里面可以看到现成的一个路由 Ro ...

  9. laravel 多控制器路由

    laravel 路由: ======================================= 公司的情况很不乐观...... 破产清算随时可能发生......

随机推荐

  1. [RxJS] Logging a Stream with do()

    To help understand your stream, you’ll almost always want to log out some the intermediate values to ...

  2. Bloom Filter 算法具体解释

    Bloom Filter 算法 Bloom filter是由Burton Bloom 在1970年提出的,其后在P2P上得到了广泛的应用.Bloom filter 算法可用来查询某一数据是否在某一数据 ...

  3. My way to Python - Day04 - 模块

    re模块 什么是正则表达式 正则表达式,英文叫做Regular Expression.简单说,正则表达式就是一组规则,用于实现字符串的查找,匹配,以实现关于字符串的相关操作,比如替换,删除等. 正则表 ...

  4. (转)AspNetPager查询分页问题(点击页码,不再是查询后的数据集)viewstate解决

    public string SQL = "select * from Memorandum";       protected void Page_Load(object send ...

  5. 控制用户的访问之权限、角色【weber出品必属精品】

    权限的作用 限制用户对数据的访问 权限的分类 1. 系统权限:能够存取数据库的权限 2. 对象权限:操作数据库对象的内容 系统权限  1.1 如何创建用户: SQL> create user t ...

  6. JSON转Model内部实现解析

    一.思路: 1.通过模型类型获得所有的属性和其类型 2.对获得的json进行处理.类型处理 3.考虑字典键值和模型属性名不一致的情况 4.添加code用于归档 5.补充JSON转字典.字典转JSON. ...

  7. 用excel做一幅像素画

    开发背景 看到网上有人发教程,如何通过在excel里设置单元格颜色画一幅画,感觉手工做太复杂,就打算用程序实现一个. 开发运行环境 python 2.7 PIL xlsxwriter 用法 pytho ...

  8. 发送trim值

    发送寄存器和地址上的所有值 uart_send(0xa1); uart_send(*((char code*)0x2001)); uart_send(*((char code*)0x2002)); u ...

  9. c#鼠标在控件上面,然后显示文字

    先添加toolTip控件到界面 然后每个控件的属性会多一项 ToolTip 第一种:直接给里面加文字 第二种: private void pictureBox_topmost_MouseHover(o ...

  10. unique &unique_copy

      unique (ForwardIterator first, ForwardIterator last); unique (ForwardIterator first, ForwardIterat ...