【问题标题】:Will grouped Laravel routes be cached? Where are they cached?分组的 Laravel 路由会被缓存吗?它们缓存在哪里?
【发布时间】:2017-07-12 08:37:30
【问题描述】:

docs中所述

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

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

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

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

【问题讨论】:

  • 你使用的是哪个 laravel 版本?
  • laravel 5.4 专业版(评论太短)
  • @ThomasMoors 哈哈开了个玩笑:D

标签: php laravel caching laravel-5.4


【解决方案1】:

分组的 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);
}

【讨论】:

  • 这是一个很好的答案,我发现了路由是如何被缓存的(在bootstrap/cache/routes.php):app('router')->setRoutes( unserialize(base64_decode(#BASE64_ENCODED_STRING#));
  • 注 2:即使像 Route::any(__('routes.account'), 'Somecontroller'); 这样的路由(注意 __() 翻译函数)也会被完美缓存!
  • 修正注2:它缓存得太好了,对于非默认语言它不再起作用了。
  • 我有 Route::group(['middleware' => ['guest'], function() { /* ... */ }); 里面没有封闭路线 - 仍然得到 Serialization of 'Closure' is not allowed 异常:-(
【解决方案2】:

引导目录

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

Documentation

【讨论】:

    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2016-08-23
    相关资源
    最近更新 更多