刀片从数据库渲染

时间:2015-03-10 07:46:51

标签: php laravel blade

在我看来,我有这段代码:

{{L::getSomeContent('content')}}

此方法返回数据库中的内容。我的问题是,是否可以直接从数据库返回并渲染Blade?例如,我已经存储在数据库中:

<img src"{{asset('somepath')}}">

但是,当直接从数据库中呈现这些数据时,它只会显示为'%7%7'

我试过了Blade::compileString

2 个答案:

答案 0 :(得分:1)

我讨厌建议这一点,但在这种情况下eval会起作用。在使用它之前,您必须确保传递给它的内容不是用户输入。如果它是你必须清理它(或信任用户,如果内容可以在某种管理工具中更改)

您应该考虑使用其他方式来组织内容,而不是使用此方法。对于路径,您可以使用占位符,并在输出之前执行字符串替换。

无论如何,请注意: eval()将执行已传递的任何PHP代码

这是一个有效的例子。当然你把它放在某种辅助函数中,以免弄乱你的视图代码,但我会把它留给你。

<?php
    $blade = L::getSomeContent('content');
    $php = Blade::compileString($blade);
    // remove php brackets because eval() doesn't like them
    $php = str_replace(['<?php', '?>'], '', $php);
    echo eval($php);
?>

正如我已经针对此特定情况(资产的路径)所提到的,您可以在内容中使用占位符。例如:

存储在数据库中

<img src"%ASSET%some/path">

然后在辅助函数内部,在输出之前,只需用实际路径替换它:

$content = L::getSomeContent('content');
$html = str_replace('%ASSET%', asset(''), $content);

答案 1 :(得分:0)

我在@blablabla的评论中找到了答案:

protected function blader($str, $data = array())
{
    $empty_filesystem_instance = new Filesystem;
    $blade = new BladeCompiler($empty_filesystem_instance, 'datatables');
    $parsed_string = $blade->compileString($str);
    ob_start() and extract($data, EXTR_SKIP);
    try {
        eval('?>' . $parsed_string);
    }
    catch (\Exception $e) {
        ob_end_clean();
        throw $e;
    }
    $str = ob_get_contents();
    ob_end_clean();
    return $str;
}

这部分似乎工作正常:

Blade::compileString($yourstring);
eval('?>' . $yourstring);