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. axis WebServices 完美调用天气预报,查询、显示 代码!

    axis WebServices 完美调用天气预报,查询.显示 代码! 效果: jsp页面: <%@ page language="java" import="ja ...

  2. 把自己的程序打成jar包,让别人调用

     我们写程序的时候往往需要把自己的程序打包成jar包,给第三方调用.Eclipse让我们非常方便的可以导出jar包.但是当程序里需要用到res里的资源时,往往就会出现问题.因为统自动生成的R类如果被打 ...

  3. ASP.net gridview控件RowEditing,RowUpdating,RowDeleting,RowCancelingEdit事件的触发

    一.说明 在gridview中删除和更新行是常用的操作,RowEditing,RowUpdating,RowDeleting,RowCancelingEdit等事件是删除更新对应的事件.如果想要使用自 ...

  4. 使用hbase的api创建表时出现的异常

    /usr/lib/jvm/java-7-openjdk-amd64/bin/java -Didea.launcher.port=7538 -Didea.launcher.bin.path=/usr/l ...

  5. Key lock 的秘密

    研究死锁,或者观察sp_lock,有时候最恼人的莫过于你看到下面研究成果的key lock,但是却不知道究竟是哪个page 哪个row被lock住了: Exec sp_lock:   就说上面的key ...

  6. WebApi实现跨域功能

    在配置文件的system.webServer节点中加入以下配置信息 <httpProtocol> <customHeaders> <add name="Acce ...

  7. linux服务器伪分布模式安装hadoop-1.1.2

    1:环境准备    1台linux服务器, hadoop安装包(apache官方网下载) jdk1.6+   2:安装jdk ,配置好环境变量(etc/profile),java -version 测 ...

  8. 使用spool命令从Oracle导出数据

    公司的网站用的是Oracle数据库,最近要导出里面的数据,使用mysql数据库 spool D:\DB\{文件名}.sql set heading off; set echo off; set fee ...

  9. 学习memcached的一个网站

    http://www.ibm.com/developerworks/cn/java/j-memcached1/#resources

  10. Shell脚本调试技术

    http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟练掌握 ...