我目前正在开发一个系统,我碰巧碰到了Laravel中的某个功能,我想知道它是如何工作的。
Route::group(array('before' => 'auth'), function()
{
Route::get('user/account', 'UserController@account');
Route::get('user/settings', 'UserController@settings');
Route::get('post/create', 'PostController@create');
Route::post('post/store', 'PostController@store');
// ...
});
从上面的代码中可以看出,Laravel能够获得所有内部路由,而不需要返回任何路由。
这是如何实现的?
提前致谢
答案 0 :(得分:1)
这是使用堆栈完成的。让我们看一下group()
方法:
public function group(array $attributes, Closure $callback)
{
$this->updateGroupStack($attributes);
// Once we have updated the group stack, we will execute the user Closure and
// merge in the groups attributes when the route is created. After we have
// run the callback, we will pop the attributes off of this group stack.
call_user_func($callback, $this);
array_pop($this->groupStack);
}
首先,您传递的属性(如'before' => 'auth'
)将保存在$this->groupStack
中。之后调用回调函数。
现在,当你进行Route::get()
时,电话会以createRoute
结尾,其中包含此部分:
if ($this->hasGroupStack())
{
$this->mergeGroupAttributesIntoRoute($route);
}
因此,如果有任何组属性,它们将与路由合并。
执行组的回调功能后,将使用array_pop
从堆栈中删除组属性。