跟我学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 相关文章推荐
Banner程序
Oct 09 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
php中几种常见安全设置详解
Apr 06 PHP
奇怪的PHP引用效率问题分析
Mar 23 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
Aug 05 PHP
IIS 7.5 asp Session超时时间设置方法
Apr 17 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 PHP
使用PHP json_decode可能遇到的坑与解决方法
Aug 03 PHP
PHP+ajax实现获取新闻数据简单示例
May 08 PHP
PHP笛卡尔积实现算法示例
Jul 30 PHP
PHP中rename()函数的妙用讲解
Feb 28 PHP
PHP 超级全局变量相关总结
Jun 30 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截取中文字符串的问题
2006/07/12 PHP
ASP知识讲座四
2006/10/09 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
PHP三元运算符的结合性介绍
2012/01/10 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
详解vue 数据传递的方法
2018/04/19 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
聚美优品广告词改编
2014/03/14 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android