当字符串与变量连接时创建自定义 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 指令而无需处理冗长字符串的最佳方法就是调用辅助方法
我创建了以下 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 指令而无需处理冗长字符串的最佳方法就是调用辅助方法