Blade :: compileString()和嵌入变量

时间:2014-09-30 11:50:02

标签: laravel blade

我能够通过以下代码解析使用刀片模板变量的HTMl:

    $generated = Blade::compileString($string);

    ob_start();

    try
    {
        eval($generated);
    }

    catch (\Exception $e)
    {
        ob_get_clean(); throw $e;
    }

    $content = ob_get_clean();

    return $content;

只要我不在其中使用刀片变量,它就能正常工作。正在解析哪个给我未定义的变量错误。如何确保刀片变量在我的自定义解析方法中可用?

2 个答案:

答案 0 :(得分:0)

原来我没有将arguments数组传递给解析Blade结构的方法。我的假设是Mail::send方法负责使变量可用,它作为第二个参数。我还必须extract($args, EXTR_SKIP)

$generated = Blade::compileString($string);

ob_start(); extract($args, EXTR_SKIP)

try
{
    eval($generated);
}
catch (\Exception $e)
{
    ob_get_clean(); throw $e;
}

$content = ob_get_clean();

return $content;

答案 1 :(得分:0)

这对我适用于最新版本的Laravel 5.7。请注意,我是如何包含__env var的,以便@ include,@ foreach等功能可以正常工作。

public static function renderBlade($string, $data = null)
{

    if (!$data) {
        $data = [];
    }

    $data['__env'] = app(\Illuminate\View\Factory::class);

    $php = Blade::compileString($string);

    $obLevel = ob_get_level();
    ob_start();
    extract($data, EXTR_SKIP);

    try {
        eval('?' . '>' . $php);
    } catch (Exception $e) {
        while (ob_get_level() > $obLevel) {
            ob_end_clean();
        }

        throw $e;
    } catch (Throwable $e) {
        while (ob_get_level() > $obLevel) {
            ob_end_clean();
        }

        throw new FatalThrowableError($e);
    }

    return ob_get_clean();
}