是否会缓存分组的Laravel路由?它们在哪里缓存?

onl*_*mas 6 php caching laravel laravel-5.4

文档中所述

基于封闭的路由无法缓存。要使用路由缓存,必须将任何Closure路由转换为控制器类。

但是,如果我想对路由进行分组,则可以使路由本身指向控制器(函数),但分组仍然是 Closure

Route::group(array('prefix' => 'admin', 'before' => 'auth'), function() // Closure
{
    Route::get('/', 'Examplecontroller@bla'); // non Closure
});
Run Code Online (Sandbox Code Playgroud)

也许出于研究目的:将路由存储在哪里?

Kys*_*lik 6

是否会缓存分组的Laravel路由?它们在哪里缓存?

是的,如果组的主体也是另一个组或非封闭式路线。

它们存储在bootstrap/cache文件夹中。


幕后花絮

像组一样的封闭(不可缓存):

Route::group(['middleware' => ['guest'], function() {
    Route::get('/hi', function() {
        dd('Hi I am closure');
    });
});
Run Code Online (Sandbox Code Playgroud)

非封闭类

Route::group(['middleware' => ['guest'], function() {
    Route::get('/hi', 'WelcomeController@hi');
    Route::get('/bye', 'WelcomeController@bye');
});
Run Code Online (Sandbox Code Playgroud)

实际上,第二个示例是闭包(显然),但是(我的猜测是)Laravel将检测到闭包仅包含另一条路线(“可缓存”)并将其重写为幕后操作(这并非完全正确,Laravel不会重写任何内容,简单演示它的外观,实际上Laravel使用Illuminate\Routing\RouteCollectionobject):

Route::get('/hi', 'WelcomeController@hi')->middleware('guest');
Route::get('/bye', 'WelcomeController@bye')->middleware('guest');
Run Code Online (Sandbox Code Playgroud)

并缓存它。

我的假设是Laravel进行某种foreach + try / catch,如果组的主体抛出ErrorException(序列化错误),它只会中止自身并向编码器大喊这是不可能的。


代码$artisan route:cache在这里

这是从route.php确定route是否“可缓存”的代码

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);
}
Run Code Online (Sandbox Code Playgroud)