分组的 Laravel 路由会被缓存吗?它们缓存在哪里?
是的,如果组的主体也是另一个组或非封闭式路线。
它们存储在bootstrap/cache 文件夹中。
幕后
类闭包(非可缓存):
Route::group(['middleware' => ['guest'], function() {
Route::get('/hi', function() {
dd('Hi I am closure');
});
});
非封闭类组
Route::group(['middleware' => ['guest'], function() {
Route::get('/hi', 'WelcomeController@hi');
Route::get('/bye', 'WelcomeController@bye');
});
事实上第二个例子是一个闭包(很明显)但是(我的猜测是)Laravel 会检测到这个闭包只包含另一个路由(那些是“可缓存的”)并在幕后重写它以跟随(这并不完全正确,Laravel 并没有重写任何它的简单演示,实际上 Laravel 使用 Illuminate\Routing\RouteCollection 对象):
Route::get('/hi', 'WelcomeController@hi')->middleware('guest');
Route::get('/bye', 'WelcomeController@bye')->middleware('guest');
并缓存它。
我的假设是 Laravel 会执行某种 foreach + try/catch,如果组的主体抛出 ErrorException(序列化错误),它会简单地中止自身并向编码器大喊这是不可能的。
$artisan route:cache 的代码是 here
这是从route.php确定路由是否“可缓存”的代码
public function prepareForSerialization()
{
if ($this->action['uses'] instanceof Closure) {
throw new LogicException("Unable to prepare route [{$this->uri}] for serialization. Uses Closure.");
}
$this->compileRoute();
unset($this->router, $this->container);
}