首页 > 代码库 > laravel3学习笔记(二)
laravel3学习笔记(二)
原作者博客:ieqi.net
====================================================================================================
路由
对于web框架而言,路由系统无疑是其中最关键的部分,Laravel3为用户提供了丰富的路由机制,极大的提高了编码效率。laravel3中,路由可以像一般框架那样绑定到controller类上,也可以直接在路由注册函数中利用回调函数实现访问逻辑。路由注册和配置代码需要编写到application/routes.php文件中。
使用回调函数的方式编写路由虽然增加的代码的耦合性,但是对于小应用而言,无疑极大的简化了整体代码的复杂度,非常方便和优雅。比如,对网站根的访问路由和访问逻辑我们可以这样写:
Route::get(‘/‘, function(){ return "Hello World!";});
如果希望这个路由对所有的http方法都有效,可以这样写:
Route::any(‘/‘, function(){ return "Hello World!";});
在RESTful大行其道的今天,对于特定http方法的路由控制,已经成为框架的标配了,在laravel中你可以这样实现:
// POST方法请求/userRoute::post(‘user‘, function(){ //});// PUT方法请求/userRoute::put(‘user/(:num)‘, function($id){ //});// DELETE方法请求/userRoute::delete(‘user/(:num)‘, function($id){ //});
也可以将多个方法注册到同一个URI上:
// /user路由同时监听GET和POST方法Router::register(array(‘GET‘, ‘POST‘), ‘user‘, function(){ //});
URI中的参数接收也很方便控制,数字:
// 使用(:num)标记来正则化数字参数Route::get(‘user/(:num)‘, function($id){ //});
字母和数字:
Route::get(‘post/(:any)‘, function($title){ //});
任何字符串:
Route::get(‘files/(:all)‘, function($path){ //});
可选的URI参数:
Route::get(‘page/(:any?)‘, function($page = ‘index‘){ //});
404控制:
注册监听404事件的回调函数:
Event::listen(‘404‘, function(){ //进行处理});
在处理请求的前、后我们都可以通过注册过滤器来对请求进行处理:
对于网站全局而言,我们有两个全局过滤器就是before与after,分别在处理请求前和处理请求之后运行,可以再application/routes.php中before和after过滤器中直接添加处理流程。
首先,创建一个过滤器:
// 过滤器名为filterRoute::filter(‘filter‘, function(){ return Redirect::to(‘home‘);});
我们将这个过滤器注册到访问blocked这个url之前处理:
Route::get(‘blocked‘, array(‘before‘ => ‘filter‘, function(){ return View::make(‘blocked‘);}));
给URL为download的请求注册一个访问后的过滤器log:
Route::get(‘download‘, array(‘after‘ => ‘log‘, function(){ //}));
给一个路由注册多个过滤器,使用|将过滤器名隔开:
Route::get(‘create‘, array(‘before‘ => ‘auth|csrf‘, function(){ //}));
给过滤器传回参数:
Route::get(‘panel‘, array(‘before‘ => ‘role:admin‘, function(){ //}));
还可以给按照URI格式注册绑定过滤器:
// 给所有以admin/开头的URL,注册过滤器auth。Route::filter(‘pattern: admin/*‘, ‘auth‘);
也可以直接在此处写上回调函数:
Route::filter(‘pattern: admin/*‘, array(‘name‘ => ‘auth‘, function(){ // }));
也可以给一组URL注册过滤器:
Route::group(array(‘before‘ => ‘auth‘), function(){ Route::get(‘panel‘, function() { // }); Route::get(‘dashboard‘, function() { // });});
如果我们需要修改URL,那么很可能会牵扯到其他相关诸如跳转之类使用到URL的代码,laravel为我们提供了路由命名的机制帮助我们解决这个问题:
Route::get(‘/‘, array(‘as‘ => ‘home‘, function(){ return "Hello World";}));
当我们需要调用/这个URL时,我们可以这样获得:
$url = URL::to_route(‘home‘);
可以这样进行跳转:
return Redirect::to_route(‘home‘);
还可以利用已经注册的URL进行当前URL判断:
if (Request::route()->is(‘home‘)){ // 当前URL名为home时执行。}
对于https协议可以这样配置路由;
Route::get(‘login‘, array(‘https‘ => true, function(){ return View::make(‘login‘);}));
也可以使用这样的简写:
Route::secure(‘GET‘, ‘login‘, function(){ return View::make(‘login‘);});
Bundle中的路由
Bundle是Laravel的模块系统。利用Bundle可以方便的处理一组请求。
在application/bundles.php中注册bundle
return array( ‘admin‘ => array(‘handles‘ => ‘admin‘),);
将所有admin开头的的URL都指向名为admin的bundle。
在bundle目录下的 routes.php 文件中:
我们可以给bundle注册一个根请求:
Route::get(‘(:bundle)‘, function(){ return ‘Welcome to the Admin bundle!‘;});
注意,这里使用了(:bundle)作为站位符号,而不是将bundle的名字硬编码到配置中,这样做的好处在于,当我们改变bundle的名字时,也不必再修改routes.php中的配置了。
然后我们可以注册这个bundle的子路径路由:
Route::get(‘(:bundle)/panel‘, function(){ return "I handle requests to admin/panel!";});
当然对于习惯使用其他框架的人来说,直接配置注册controller到路由更为熟悉。
需要注意的是,在laravel中,所有的路由必须要被显式注册才可以使用,否则就无法访问。
当然,也包括在controller中自动注册的各个方法,使路由暴露。
注册了controller类之后可以按照这样的url格式进行访问:
http://yoursite/controller/method/arguments
如果没有method名,那么将会指向controller类中个 index 方法。
一般而言,你希望注册所有的controller类,可以这样写:
Route::controller(Controller::detect());
注册所有的在bundle名为admin中的controller类:
Route::controller(Controller::detect(‘admin‘));
注册名为home的controller类:
Route::controller(‘home‘);
注册多个controller类:
Route::controller(array(‘dashboard.panel‘, ‘admin‘));
除了以上的路由控制还可以使用如下方法更灵活的控制路由:
将某个controller类中的方法帮到到特定路由:
// home类中的index方法帮到到welcome URL上。Route::get(‘welcome‘, ‘home@index‘);
将某个controller类中的方法帮到到特定路由并且挂上过滤器:
Route::get(‘welcome‘, array(‘after‘ => ‘log‘, ‘uses‘ => ‘home@index‘));
将某个controller类中的方法帮到到特定路由并且挂上过滤器,并且命名:
Route::get(‘welcome‘, array(‘as‘ => ‘home.welcome‘, ‘uses‘ => ‘home@index‘));
在命令中对特定路由进行访问(往往用于测试),和调用接口。
php artisan route:call get api/user/1