您的位置:首页 > 编程语言 > PHP开发

Laravel 4 入门三讲(中)laravel 的路由是如何完成注册的?

2016-04-25 10:21 423 查看
目录[-]

group()

createRoute()

相关文件的源码请参考:

  上篇分析了 Laravel 4 的启动流程 “Laravel 4 在启动的时候到底做了什么?”,读过的朋友应该对 Laravel 4 文件的加载顺序有了一个比较清晰的认识,这样就可以顺利的完成开发前的配置及准备工作。

  而开发阶段我们将会面临另一个难点——路由。

  通常,在看过官方文档后就可以比较顺利的使用路由,我们知道在 routes.php 文件中可以通过定义 Route::get() Route::post() Route::group() 等方法来注册我们的路由,然而你真的了解这些路由是怎么注册进我们的程序的吗?

  除了“RESTful控制器”和“资源控制器”之外,所有的路由注册最终都指向 Illuminate\Routing\Router.php 的 createRoute 方法。而另一个重要的辅助方法则是 group 分组路由。只有理解了这两个方法,才算是完全理解了路由的注册机制。

group()

  让我们从 group 方法开始,这个方法可以直接使用,像这样 Route::group(array(), function(){}); 下面是它的源码:

?
  第4行的作用是将传入的 $attributes 数组存储到 $this->groupStack 这个分组属性的堆栈中,如果出现了嵌套使用分组路由的情况,则对传入的属性数据做递归处理。这些临时存储的属性将在第7行,也就是最终执行到 createRoute
方法时被存储到各个线路中去,与各自的行为参数合并。第10行的出栈操作则是避免嵌套使用的分组路由出现属性存储的错误。

  这里有两个重点:

Route::group() 中的匿名函数将会立即被执行,而不像 Route::get() 中的匿名函数被存储为回调函数后期调用,所以如果你在分组路由的匿名函数中放上一个 dd() 那么恭喜,你的整个程序都会 dd 在那里了。
关于 $attributes 数组,建议在此定义的属性如下:

?

createRoute()

  接下来,让我们来看看 createRoute 方法,像 Route::get('/', function(){}); 这样的调用最终都会指向它,下面是它的源码:

?
  这部分的注释已经写的相当详细了,需要特别说明的是:

从14到25行,正是这部分操作将分组路由的属性合并入其下各个线路的行为参数中去。所以理论上来说这里支持的行为参数,在分组路由的属性中都是可以被定义的,但是出于各种考虑,分组路由的属性还是仅建议定义上面提到的那几种。
第64行的操作将会照成同名路由被覆盖,而路由的名称则是根据“域名”“模式字符串”等数据进行构造的,并且如果存在 as 行为参数的话则直接使用 as 的字符串。所以像 as 这种行为参数如果你要把它放到分组路由的属性中去定义的话,那我只能哈哈了。
支持定义的行为参数如下:

?
支持的简写:

?

相关文件的源码请参考:

http://git.oschina.net/chengwu/cnComment-Laravel-4/blob/master/vendor/laravel/framework/src/Illuminate/Routing/Router.php
http://git.oschina.net/chengwu/cnComment-Laravel-4/blob/master/vendor/laravel/framework/src/Illuminate/Routing/Route.php
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: