【问题标题】:Blade render from database来自数据库的刀片渲染
【发布时间】:2015-03-10 17:41:20
【问题描述】:

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

{{L::getSomeContent('content')}}

此方法从数据库返回内容。我的问题是,是否可以直接从数据库返回和渲染 Blade?比如我已经存储在数据库中:

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

但是当直接从数据库中渲染这些数据时,它只会显示为 '%7%7'

我试过Blade::compileString

【问题讨论】:

  • 哪个 laravel 版本?
  • 版本:Laravel 4.2
  • Blade::compileString() 应该可以工作。你从中得到了什么?
  • 对于图像示例,它将返回:
  • 我前段时间在用于 jQuery 数据表的后端代码的 Laravel 包的源代码中看到了这一点。搜索方法'blader'。 github.com/bllim/laravel4-datatables-package/blob/master/src/…

标签: php laravel blade


【解决方案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);

【讨论】:

  • 虽然这个答案是完全正确的,但永远不要使用它。通常,如果您使用的是框架并且最终将 eval() 放入模板中,则您的方法需要修改。
  • @Joe 我完全同意。不幸的是,我认为没有其他方法(除了更改现有的内容系统)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 2020-07-10
    • 2018-05-17
    • 2016-03-17
    • 2016-04-04
    • 2018-10-03
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多