Laravel5.1学习之旅(二) 路由
上一篇:Laravel5.1学习之旅(一) 安装Laravel5.1
访问一个页面,你可以不需要Model、View和Controller,但必然需要路由(Route)
本文示例代码可能会涉及到Controller、Model、View,这些内容将会在下一篇介绍,对于学习本文没有影响
路由是什么
学过计算机网络的都知道,路由负责将接收到的数据包拆解出目标ip地址等信息,然后根据路由表进行分组转发给下一个目标。
Web框架中的路由也是如此,它将请求中的URL拆解为控制器、方法、参数等信息,然后调用相应的控制器文件来处理业务,最后将带有数据的视图呈现给用户。当然,Laravel显得更为简单粗暴,它直接提供了一个路由表app/Http/route.php
,你可以在该文件定制你的路由规则。这样你的路由非常直观且灵活,代价就是当你要添加一个新的请求时必须要在该文件添加一条新的路由规则。
最简单的路由
废话懒得说,直接上代码:
Route::get('/',function(){
return 'Hello foam';
});
可以看到,上面的Route::get需要传递两个参数,第一个是URL,第二个是闭包方法。因为是闭包方法,你可以在里面写业务逻辑,这里我们只简单返回一个Hello foam。
在浏览器中输入http://foam.com
(网站根目录),页面会打印出Hello foam。
基础路由
基本路由:
<?php //以get方法访问http://foam.com/home时将执行HomeController里的index方法 Route::get('home','HomeController@index'); //除此之外还有post、put、delete等方式。一般用得比较多的是get和post Route::post('home','HomeController@index'); Route::put('home','HomeController@index'); Route::delete('home','HomeController@index');
带有参数的路由:
很多场景的url都是带有参数的,例如文章详细页http://foam.com/article/9434
Route::get('article/{id}','ArticleController@detail');
如此一来,ArticleController的detail方法便能接收到id参数,具体方法我们下一篇介绍
路由群组:
路由群组一方面将一组相关路由写在一块,提高了代码可读性;另一方面简化了代码,可利用中间件统一处理相关代码
举个例子,假如我们需要写个后台管理,URL为http://foam.com/backend/***/
,命名空间为Admin
,且需要使用中间件AdminAuth
对后台管理系统的所有请求作权限验证。
没有群组,需要这么写:
Route::get('backend/aaaaa', ['middleware' => 'AdminAuth', 'Admin\AaaController@index']); Route::get('backend/bbbbb', ['middleware' => 'AdminAuth', 'Admin\BbbController@index']); Route::get('backend/ccccc', ['middleware' => 'AdminAuth', 'Admin\CccController@index']);
现在让我们的群组重新演绎:
Route::group(['prefix'=>'backend','namespace'=>'Admin','middleware'=>'AdminAuth'],function(){ Route::get('/aaaaa','AaaController@index'); Route::get('/bbbbb','BbbController@index'); Route::get('/ccccc','CccController@index'); });
群组里prefix是URL前缀,namespace是命名空间,middleware是中间件,这些都是可选的。
群组也是可以嵌套的,当部分页面需要同一个中间件处理时,可以这么做:
Route::group(['namespace'=>'Home'],function(){ Route::get('/', 'PageController@index'); Route::get('task/{id}','TaskController@detail'); Route::group(['middleware'=>'UserAuth'],function(){ Route::get('myhome','MyhomeController@index'); Route::get('myhome/taskDetail/{id}','MyhomeController@taskDetail'); }); });