在我看来,我有这段代码:
{{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);