如docs
中所述无法缓存基于闭包的路由。要使用路由缓存,您必须 将任何Closure路由转换为控制器类。
但是如果我想分组路线,我可以让路线本身指向控制器(功能),但该组仍然是Closure
Route::group(array('prefix' => 'admin', 'before' => 'auth'), function() // Closure
{
Route::get('/', 'Examplecontroller@bla'); // non Closure
});
可能出于研究目的:缓存路线在哪里?
答案 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)