我刚刚为 Laravel 4.2 创建了一个仅适用于 Linux 的版本(使用 shm 来创建临时文件)。它也可以在其他操作系统上运行,但是速度会慢一些,因为使用了通常的临时文件。
<?php
class FilesDeletionQueue {
protected $files = [];
public function add($filename) {
$this->files[] = $filename;
}
public function flush() {
$result = true;
foreach ($this->files as $filename) {
if (@unlink($filename) === false) {
$result = false;
}
}
return $result;
}
}
class Helpers {
static public function viewFromStr($tplName, $pageContent, array $data) {
global $app;
$tempname = tempnam('/run/shm/', 'laravel_blade');
if (@file_put_contents($tempname, $pageContent) === false) {
$tempname = tempnam(storage_path(), 'laravel_blade');
if (@file_put_contents($tempname, $pageContent) === false) {
throw new \Exception("Cannot create {$tempname} in " . __METHOD__);
}
}
$resolver = $app['view.engine.resolver'];
$finder = $app['view.finder'];
$env = new \Illuminate\View\Factory($resolver, $finder, $app['events']);
$env->setContainer($app);
$pageView = new \Illuminate\View\View(
$env,
$env->getEngineResolver()->resolve('blade'),
$tplName,
$tempname,
$data
);
$env->callCreator($pageView);
try {
$fdq = App::make('files_deletion_queue');
} catch (\Exception $e) {
App::singleton('files_deletion_queue', function() {
return new FilesDeletionQueue();
});
$fdq = App::make('files_deletion_queue');
App::shutdown(function() {
App::make('files_deletion_queue')->flush();
});
}
$fdq->add($tempname);
return $pageView;
}
}
然后您可以像这样使用它:
$pageView = Helpers::viewFromStr('content', $pageContent, $this->data);
$this->layout->with('content', $pageView)
->with('menus', $this->menus )
->with('page',$this->data);
而不是:
/*
$this->layout->nest('content',"pages.template.{$row->filename}",$this->data)
->with('menus', $this->menus )
->with('page',$this->data);
*
*/
很遗憾,推荐的方法无法从任意操作系统路径加载blade文件,并且没有现成的支持从RAM编译的支持(我听说twig更容易实现)。