当字符串与变量连接时创建自定义 Laravel Blade 指令的更简单方法

Easier way to create a custom Laravel Blade directive when a string is being concatenated with variables

我创建了以下 blade 指令:

    Blade::directive('bundle', function ($component) {
        $string = "\":langs='\" . file_get_contents(base_path() . \"/resources/bundles/\" . App::currentLocale() . \"/$component.json\").\"'\";";
        return ("<?php echo " . $string . "?>");
    });

为了更好地理解发生了什么,这是我想用上面的字符串表示的代码(但作为 Blade 指令,这不是一个选项):

$path = base_path() . "\resources\bundles\" . App::currentLocale() ."\$component.json";
$json = file_get_contents($path);
return "<?php echo \":langs='\" $json \"'\"; ?>

现在,当 .json 文件中有单引号时,上面的 Blade 指令将不起作用,因为外部引号也是单引号。但无论如何,我感觉很难全神贯注地创建这个字符串,我想知道,是否有更简单的方法来生成最终字符串以回显结果?

根据你的信息,我得到的是:

Blade::directive('bundle', function ($component) {
    $encoding = JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT;
    $component = trim($component, "'\" ");

    $string = sprintf(
        '":langs=\'" . json_encode(json_decode(file_get_contents(%s), true), %d) . "\'"',
        'resource_path("bundles/" . App::getLocale() . "/' . $component . '.json")',
        $encoding
    );

    return ('<?php echo ' . $string . '?>');
});

最后我创建了一个辅助函数和 return 一个从 blade 指令调用该函数的字符串:

Blade::directive('bundle', function ($bundle) {
    return ":langs=\"{{json_bundle_translations($bundle)}}\"";          
});

然后辅助函数如下所示:

    function json_bundle_translations($bundle)
{
    $path = base_path() . "\resources\bundles\" . App::currentLocale() . "\$bundle.json";
    return file_get_contents($path);
}

感觉比在指令中的字符串中包含字符串更容易理解,它还提供了一个函数来单独检索 Json,以备不时之需。

我会暂时搁置这个问题,看看是否有人能提出更好的解决方案。

编辑:我发现创建复杂 blade 指令而无需处理冗长字符串的最佳方法就是调用辅助方法