Php 从数据库渲染刀片

Php 从数据库渲染刀片,php,laravel,blade,Php,Laravel,Blade,在我看来,我有以下代码: {{L::getSomeContent('content')}} 此方法从数据库返回内容。我的问题是,是否可以直接从数据库返回并渲染Blade?例如,我在数据库中存储了: <img src"{{asset('somepath')}}"> 但是当直接从数据库呈现此数据时,它将显示为“%7%7” 我已经尝试了Blade::compileString我不想建议这样做,但是eval在这种情况下会起作用。在使用它之前,必须确保传递给它的内容不是用户输入。如果是

在我看来,我有以下代码:

{{L::getSomeContent('content')}}
此方法从数据库返回内容。我的问题是,是否可以直接从数据库返回并渲染Blade?例如,我在数据库中存储了:

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

但是当直接从数据库呈现此数据时,它将显示为“%7%7”


我已经尝试了
Blade::compileString

我不想建议这样做,但是
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);
?>

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

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);

哪个laravel版本?版本:laravel 4.2
Blade::compileString()
应该可以工作。您从中得到了什么?对于图像示例,它将返回以下内容:我不久前在用于jQuery datatables后端代码的Laravel包的源代码中看到了这一点。搜索方法“blader”。虽然这个答案是完全正确的,但永远不要使用它。通常,如果您使用的是一个框架,并且最终在模板中放入了
eval()
,那么您的方法需要修改。@Joe我完全同意。不幸的是,我认为没有其他办法(除了改变现有的内容系统)
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);