Laravel Blade 指令添加额外的引号

Posted

技术标签:

【中文标题】Laravel Blade 指令添加额外的引号【英文标题】:Laravel Blade directive adding extra quotes 【发布时间】:2020-11-16 10:27:45 【问题描述】:

我使用的是 Laravel 7,所以我认为这不会成为问题。

只是关于我的安装说明,它是从 5.3 升级而来的。

我的问题在于我创建的自定义 Blade 指令。 它在输入周围添加了额外的引号

我添加了一个 dd() 来查看为什么我的 Helper 不起作用。

我的服务提供者

    Blade::directive('setting', function ($expression) 
        dd($expression);
        return SettingHelper::value($expression);
    );

查看文件

@setting('theme_public')

dd() 的输出

"'theme_public'"

预期输出

'theme_public'

我不知道为什么要添加额外的引号。

【问题讨论】:

在 ServiceProvider 中尝试 return $expression;。可能是您在 SettingHelper 中的问题。 【参考方案1】:

你是对的,我在安装新的 laravel 7 时得到了相同的行为。

我创建了一些小测试,看看发生了什么。我认为最好这样解释这种行为。想象一下,您正在使用一个变量调用视图:

return view('welcome', ['var' => "Hallo"]);

你有一个像这样的自定义刀片指令:

Blade::directive('dirtest', function ($expression) 
    dd($expression);
);

如果你在模板中使用它,输出是这样的:

@dirtest($var)
// output of dd in the browser:
"$var"

所以刀片指令似乎只是为了用更冗长的 php 代码替换一些速记指令。实际代码稍后在刀片模板引擎中执行。这是有道理的,因为刀片模板也被缓存以加快执行速度。在自定义指令已经嵌入的缓存版本中,您的自定义函数不再被触发。我希望这个解释对你有意义。

这对你意味着什么

这真的取决于您的用例。如果你有一个自定义指令,它只传递常量字符串,你可能只需要写就可以了:

@setting(theme_public)

但如果有一点点机会,你可能会不时传入一个变量,比如

@setting($theme)

您确实必须返回代码,该代码利用该变量并且可以在以后进行评估。

【讨论】:

谢谢。我想我明白你的意思。由于该指令只需要一个静态字符串,我将使用 if ( Str::startsWith($expression, '"') || Str::startsWith($expression, "'") ) ... 转义引号 - 我现在就是这样做的,但认为有一个错误。 如果你有一个静态字符串,只需这样做@setting(theme_public),这会给你一个 dd($expression) 作为“theme_public”

以上是关于Laravel Blade 指令添加额外的引号的主要内容,如果未能解决你的问题,请参考以下文章

laravel-模板引擎Blade

5 个非常有用的 Laravel Blade 指令,你用过哪些?

Laravel Blade @guest 指令用于多个守卫

如何在 vuejs 指令中使用 Laravel Blade 语法?

Laravel 中的 Blade 模板与普通 php

Laravel/Blade 表单添加“必需”以选择元素