Laravel Group Filters如何在没有返回的情况下从闭包中获取值

时间:2015-04-23 21:42:30

标签: php laravel routing routes

我目前正在开发一个系统,我碰巧碰到了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能够获得所有内部路由,而不需要返回任何路由。

这是如何实现的?

提前致谢

1 个答案:

答案 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从堆栈中删除组属性。