跟我学Laravel之路由


Posted in PHP onOctober 15, 2014

基本路由

应用中的大多数路都会定义在 app/routes.php 文件中。最简单的Laravel路由由URI和闭包回调函数组成。

基本 GET 路由

Route::get('/', function()

{

    return 'Hello World';

});

基本 POST 路由

Route::post('foo/bar', function()

{

    return 'Hello World';

});

注册一个可以响应任何HTTP动作的路由

Route::any('foo', function()

{

    return 'Hello World';

});

仅支持HTTPS的路由

Route::get('foo', array('https', function()

{

    return 'Must be over HTTPS';

}));

实际开发中经常需要根据路由生成 URL,URL::to方法就可以满足此需求:

$url = URL::to('foo');

路由参数

Route::get('user/{id}', function($id)

{

    return 'User '.$id;

});

可选路由参数

Route::get('user/{name?}', function($name = null)

{

    return $name;

});

带有默认值的可选路由参数

Route::get('user/{name?}', function($name = 'John')

{

    return $name;

});

用正则表达式限定的路由参数

Route::get('user/{name}', function($name)

{

    //

})

->where('name', '[A-Za-z]+');
Route::get('user/{id}', function($id)

{

    //

})

->where('id', '[0-9]+');

传递参数限定的数组

当然,必要的时候你还可以传递一个包含参数限定的数组作为参数:

Route::get('user/{id}/{name}', function($id, $name)

{

    //

})

->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))

定义全局模式

如果希望在全局范围用指定正则表达式限定路由参数,可以使用 pattern 方法:

Route::pattern('id', '[0-9]+');
Route::get('user/{id}', function($id)

{

    // Only called if {id} is numeric.

});

访问路由参数

如果想在路由范围外访问路由参数,可以使用 Route::input 方法:

Route::filter('foo', function()

{

    if (Route::input('id') == 1)

    {

        //

    }

});

路由过滤器

路由过滤器提供了非常方便的方法来限制对应用程序中某些功能访问,例如对于需要验证才能访问的功能就非常有用。Laravel框架自身已经提供了一些过滤器,包括 auth过滤器、auth.basic过滤器、guest过滤器以及csrf过滤器。这些过滤器都定义在app/filter.php文件中。

定义一个路由过滤器

Route::filter('old', function()

{

    if (Input::get('age') < 200)

    {

        return Redirect::to('home');

    }

});

如果从路由过滤器中返回了一个response,那么该response将被认为对应的是此次request,路由将不会被执行,并且,此路由中所有定义在此过滤器之后的代码也都不会被执行。

为路由绑定过滤器

Route::get('user', array('before' => 'old', function()

{

    return 'You are over 200 years old!';

}));

将过滤器绑定为控制器Action

Route::get('user', array('before' => 'old', 'uses' => 'UserController@showProfile'));

为路由绑定多个过滤器

Route::get('user', array('before' => 'auth|old', function()

{

    return 'You are authenticated and over 200 years old!';

}));

指定过滤器参数

Route::filter('age', function($route, $request, $value)

{

    //

});
Route::get('user', array('before' => 'age:200', function()

{

    return 'Hello World';

}));

所有其后的过滤器将接收到 $response作为第三个参数:

Route::filter('log', function($route, $request, $response, $value)

{

    //

});

基于模式的过滤器

你也可以指针对URI为一组路由指定过滤器。

Route::filter('admin', function()

{

    //

});
Route::when('admin/*', 'admin');

上述案例中,admin过滤器将会应用到所有以admin/开头的路由中。星号是通配符,将会匹配任意多个字符的组合。

还可以针对HTTP动作限定模式过滤器:

Route::when('admin/*', 'admin', array('post'));

过滤器类

过滤器的高级用法中,还可以使用类来替代闭包函数。由于过滤器类是通过IoC container实现解析的,所有,你可以在这些过滤器中利用依赖注入(dependency injection)的方法实现更好的测试能力。

定义一个过滤器类

class FooFilter {
    public function filter()

    {

        // Filter logic...

    }
}

注册过滤器类

Route::filter('foo', 'FooFilter');

命名路由

重定向和生成URL时,使用命名路由会更方便。你可以为路由指定一个名字,如下所示:

Route::get('user/profile', array('as' => 'profile', function()

{

    //

}));

还可以为 controller action指定路由名称:

Route::get('user/profile', array('as' => 'profile', 'uses' => 'UserController@showProfile'));

现在,你可以使用路由名称来创建URL和重定向:

$url = URL::route('profile');
$redirect = Redirect::route('profile');

可以使用currentRouteName方法来获取当前运行的路由名称:

$name = Route::currentRouteName();

路由组

有时你可能需要为一组路由应用过滤器。使用路由组就可以避免单独为每个路由指定过滤器了:

Route::group(array('before' => 'auth'), function()

{

    Route::get('/', function()

    {

        // Has Auth Filter

    });
    Route::get('user/profile', function()

    {

        // Has Auth Filter

    });

});

子域名路由

Laravel中的路由功能还支持通配符子域名,你可以在域名中指定通配符参数:

注册子域名路由

Route::group(array('domain' => '{account}.myapp.com'), function()

{
    Route::get('user/{id}', function($account, $id)

    {

        //

    });
});

路由前缀

可以通过prefix属性为组路由设置前缀:

为路由组设置前缀

Route::group(array('prefix' => 'admin'), function()

{
    Route::get('user', function()

    {

        //

    });
});

路由与模型绑定

模型绑定,为在路由中注入模型实例提供了便捷的途径。例如,你可以向路由中注入匹配用户ID的整个模型实例,而不是仅仅注入用户ID。首先,使用 Route::model 方法指定要被注入的模型:

将参一个模型

Route::model('user', 'User');
然后,定义一个包含{user}参数的路由:

Route::get('profile/{user}', function(User $user)

{

    //

});

由于我们已将{user}参数绑定到了User模型,因此可以向路由中注入一个User实例。例如,对profile/1的访问将会把ID为1的User实例注入到路由中。

注意: 如果在数据库中无法匹配到对应的模型实例,404错误将被抛出。
如果你希望自定义"not found"行为,可以通过传递一个闭包函数作为 model 方法的第三个参数:

Route::model('user', 'User', function()

{

    throw new NotFoundException;

});

如果你想自己实现路由参数的解析,只需使用Route::bind方法即可:

Route::bind('user', function($value, $route)

{

    return User::where('name', $value)->first();

});

抛出 404 错误

有两种从路由中手动触发404错误的方法。首先,你可以使用App::abort方法:

App::abort(404);

其次,你可以抛出Symfony\Component\HttpKernel\Exception\NotFoundHttpException异常。

更多关于处理404异常以及错误发生时自定义response的信息可以查看错误文档。

控制器路由

Laravel不光提供了利用闭包函数处理路由的功能,还可以路由到控制器,甚至支持创建 resource controllers。

PHP 相关文章推荐
PHP中使用gettext来支持多语言的方法
May 02 PHP
php 冒泡排序 交换排序法
May 10 PHP
php获取后台Job管理的实现代码
Jun 10 PHP
php文件操作实例代码
May 10 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
Jun 23 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
PHP+redis实现添加处理投票的方法
Nov 14 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
yii2安装详细流程
May 23 PHP
跟我学Laravel之请求(Request)的生命周期
Oct 15 #PHP
跟我学Laravel之配置Laravel
Oct 15 #PHP
跟我学Laravel之安装Laravel
Oct 15 #PHP
跟我学Laravel之快速入门
Oct 15 #PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 #PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 #PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 #PHP
You might like
用PHP查询域名状态whois的类
2006/11/25 PHP
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
有趣的javascript数组定义方法
2010/09/10 Javascript
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
Vue2.0如何发布项目实战
2017/07/27 Javascript
vue filters的使用详解
2018/06/11 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
如何解决python多种版本冲突问题
2020/10/13 Python
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
幼儿教师思想汇报
2014/01/10 职场文书
媒体宣传策划方案
2014/05/25 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
Java 多线程协作作业之信号同步
2022/05/11 Java/Android