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)
也许出于研究目的:将路由存储在哪里?
是否会缓存分组的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是在这里
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)