在我看来,我有这段代码:
{{L::getSomeContent('content')}}
此方法返回数据库中的内容。我的问题是,是否可以直接从数据库返回并渲染Blade?例如,我已经存储在数据库中:
<img src"{{asset('somepath')}}">
但是,当直接从数据库中呈现这些数据时,它只会显示为'%7%7'
我试过了Blade::compileString
答案 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);