从字符串而不是文件渲染刀片

时间:2014-02-04 15:49:13

标签: laravel-4 blade

如何呈现包含刀片语法的字符串?

View::make('directory.file-name')->with('var', $var);  // Usual usage

View::render('{{$var}}')->with('var', $var); // Like this for Example

我使用写了一个生成刀片语法的脚本,如果可能的话我想直接将它的输出提供给刀片引擎。

由于

2 个答案:

答案 0 :(得分:2)

希望这有帮助,

https://github.com/TerrePorter/StringBladeCompiler

这是下一个链接的分支,它删除了db模型要求,并将其替换为需要三个必需键('template','cache_key','updated_at')的数组,而不是完整的Eloquent模型。

https://github.com/Flynsarmy/laravel-db-blade-compiler

这使用Eloquent模型来获取模板。

答案 1 :(得分:1)

我刚刚将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;

        // Try to create temporary blade template file in shm memory,
        // if fails, create as usual temporary file.
        $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__);
            }
        }

        // Create template from shm memory file.
        $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();
            });
        }
        // Add tempname to list of files to be deleted when application ends.
        $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);
     * 
     */

推荐的方法无法从任意操作系统路径中加载刀片文件,并且没有现成的开箱即用支持从RAM编译(我听说它更容易用于twig),这真的让人很难过