我知道Blade已经为所有刀片视图缓存了已编译的PHP,但我想更进一步.我正在处理的网站被模块化为组件视图,然后在默认控制器中拼凑在一起.每个"窗口小部件"都有自己的视图,很少更改内容(除了一些经常更新的内容).所以,我想缓存这些很少变化的视图的HTML输出,以防止在每个页面加载时对它们进行评估.
在Laravel 3中我们可以这样做(信用Laravel论坛):
Event::listen(View::loader, function($bundle, $view)
{
return Cache::get($bundle.'::'.$view, View::file($bundle, $view,
Bundle::path($bundle).'view'));
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,View::loader在Laravel 4已经完全消失在挖通\Illuminate\View\View和\Illuminate\View\Environment,我发现每个视图调度名为事件"composing: {view_name}".侦听此事件会提供在每个视图渲染时传递给它的视图名称和数据,但是从回调返回的效果与Laravel 3中的效果不同:
Event::listen('composing: *', function($view) {
if(!in_array($view->getName(), Config::get('view.alwaysFresh'))) {
// Hacky way of removing data that we didn't pass in
// that have nasty cyclic references (like __env, app, and errors)
$passedData = array_diff_key($view->getData(), $view->getEnvironment()
->getShared());
return Cache::forever($view->getName() . json_encode($passedData), function() {
return 'test view data -- this should appear in the browser';
});
}, …Run Code Online (Sandbox Code Playgroud)