首页 > 代码库 > 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