从数据库呈现刀片


Blade render from database

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

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

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

存储在数据库中

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

然后在辅助函数中,在输出之前,只需将其替换为真实路径:

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

我在@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);