在Laravel中,为什么使用`before`应用程序事件,`Request :: segment()`方法工作正常,`Route :: currentRouteName()`没有?

时间:2015-02-03 22:18:02

标签: php laravel

在Laravel PHP Framework app/filters.php文件中,当我尝试将before方法用于{时,您可以在其中找到应用程序的afterRequest::segment()事件{1}}事件,它工作正常并且符合预期:

before

但是当我尝试使用App::before(function($request) { if (strtolower(Request::segment(1)) === 'something') { // code here.. } }); 这样的方法时:

Route::currentRouteName()

它没有按预期工作。

为什么使用App::before(function($request) { if (strtolower(Route::currentRouteName()) === 'route_name') { // code here.. } }); 应用程序事件,before方法正常,Request::segment()没有?

2 个答案:

答案 0 :(得分:1)

在设置和实例化应用程序对象之前,设置并实例化请求对象。这意味着当应用程序的before事件触发时,Request对象已经填充了其URL段以及来自PHP的本机请求超级全局变量的其他值。

路由器对象在应用程序对象之前不是胜任设置和实例化。如果你看一下currentRouteName方法的定义

#File: vendor/laravel/framework/src/Illuminate/Routing/Router.php
public function currentRouteName()
{
    return ($this->current()) ? $this->current()->getName() : null;
}

public function current()
{
    return $this->current;
}

通过操作current对象属性,您将看到它的工作原理。此对象属性在findRoute方法中设置。

#File: vendor/laravel/framework/src/Illuminate/Routing/Router.php
protected function findRoute($request)
{
    $this->current = $route = $this->routes->match($request);

    return $this->substituteBindings($route);
}

Laravel的核心系统代码不会调用findRoute方法,直到 之后,实例化应用程序对象并触发before事件。即 - 当你的before观察员/听众开火时,Laravel还不知道路线是什么。

答案 1 :(得分:0)

答案很简单。因为目前的路线还不可用。全局before过滤器在找到并分派匹配路由之前运行。

然而,请求可以提前使用,因此Request::segment()可以正常工作。

你到底想要完成什么?