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