请求刀片视图模板中使用的所有变量的列表

时间:2017-07-10 15:50:11

标签: php laravel laravel-blade

我们有一系列外包邮件的刀片视图模板,我们希望为内部管理创建一种简单的方法来预览这些电子邮件而无需实际发送。

我可以保留,并提供填充变量,但如果有办法请求视图中使用的变量列表,我会非常好奇吗?

例如,我有一个基本视图" greeting.blade.php"那说:

Dear {{$customerFirstName}} {{$customerLastName}},

我想:

$usedVariablesArray = getVariablesFromView("greeting");

让它回归:

['customerFirstName', 'customerLastName']

是否有任何内置于laravel中的东西可以提供这种功能?

[编辑] 我想从相关视图文件外部执行此操作。

public function previewEmailTemplate($templateName) {
    $usedVariables = $getArrayOfVariables($template);
    // Would return ['customerFirstName', 'customerLastName']

    foreach($usedVariables as $aUsedVariable) {
        $dummyValues[$aUsedVariable] = $aUsedVariable;
    }

    return view($template, $dummyValues)->render();
}

因此,此函数将使用变量名称在变量位置呈现模板。

这会让我的问题更清楚吗?

2 个答案:

答案 0 :(得分:0)

我也需要这样的功能,但是在网上找不到。

我写了一个简单的函数来做。

可以帮助您

greeting.blade.php

Dear {{$customerFirstName}} {{$customerLastName}},

functions.php

function getVariablesFromView($templatePath)
{
    // $templatePath = '/resources/views/mails/greeting.blade.php'
    $contents = file_get_contents($templatePath);

    $re = '/{{[\ ]*\$[a-zA-Z]+[\ ]*}}/m';
    preg_match_all($re, $contents, $matches, PREG_SET_ORDER, 0);
    $flatternArray = [];
    array_walk_recursive($matches, function ($a) use (&$flatternArray) {$flatternArray[] = $a;});
    $variables = str_replace(['{{', '}}', '$', ' '], '', $flatternArray);

    return $variables;
    // ['customerFirstName', 'customerLastName']
}

p.s。 此功能不支持@extend('xxx')

之类的高级刀片语法

答案 1 :(得分:0)

感谢您对这个问题的第一个回答董承桦,我的回答只是您编写内容的扩展,涵盖了更多用例。如果愿意,可以使用此改进的代码随时更新您的答案。

具体来说,此版本支持包含下划线的php变量名,例如$ very_good_variable等。它还支持“未转义”的Laravel Blade语法,即{!! $ something_something !!},而不是{{$ something_something}}。正则表达式不是我的强项,我敢肯定有办法使它与更简洁的代码一起使用,但是它确实有效。

function getVariablesFromView(($templatePath){
                        //this version tests for standard blade variables... of the form {{ $something_something }}
                        $re = '/{{[\ ]*\$[a-zA-Z_]+[\ ]*}}/m';
                        preg_match_all($re, $contents, $matches, PREG_SET_ORDER, 0);
                        $flatternArray = [];
                        array_walk_recursive($matches, function ($a) use (&$flatternArray) {$flatternArray[] = $a;});
                        $regular_variables = str_replace(['{{', '}}', '$', ' '], '', $flatternArray);

                        //this version tests for unescaped blade variables... of the form {!! $something_something !!}
                        $re = '/{!![\ ]*\$[a-zA-Z_]+[\ ]*!!}/m';
                        preg_match_all($re, $contents, $matches, PREG_SET_ORDER, 0);
                        $flatternArray = [];
                        array_walk_recursive($matches, function ($a) use (&$flatternArray) {$flatternArray[] = $a;});
                        $unescaped_variables = str_replace(['{!!', '!!}', '$', ' '], '', $flatternArray);

                        $variables = array_merge($regular_variables,$unescaped_variables);
                        return $variables;

}