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

时间:2017-07-12 08:37:30

标签: php laravel caching laravel-5.4

docs

中所述
  

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

但是如果我想分组路线,我可以让路线本身指向控制器(功能),但该组仍然是Closure

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

可能出于研究目的:缓存路线在哪里?

2 个答案:

答案 0 :(得分:5)

  

是否会对分组的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将检测到闭包只包含另一个路径(即#34;可缓存")并重写它幕后跟随(这不完全正确,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);
}

答案 1 :(得分:1)

引导程序目录

bootstrap目录包含引导框架和配置自动加载的文件。该目录还包含一个cache目录,其中包含用于性能优化的框架生成文件,例如路由和服务缓存文件。

Documentation