在Laravel PHP Framework app/filters.php
文件中,当我尝试将before
方法用于{时,您可以在其中找到应用程序的after
和Request::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()
没有?
答案 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()
可以正常工作。
你到底想要完成什么?