首页 > 解决方案 > Laravel 在自定义刀片指令中使用数据库中的变量

问题描述

概括

自定义刀片指令在不先清除视图缓存的情况下不使用数据库中的当前值。由于用户可以更改该值并影响视图,因此我需要该指令始终从数据库中提取当前值,而不是使用缓存的值(这适用于 @auth 之类的指令,那么为什么不使用我的自定义指令呢?)。

背景

我使用本教程编写了一个自定义指令,它的作用基本相同,根据存储在数据库中的值显示不同的内容。我遇到的问题是,如果变量从 false 更改为 true,例如,指令被旧值卡住,当它在数据库中更改时它不会更新它。当我清除视图缓存时它确实有效,但我希望它始终使用存储在数据库中的当前值。

代码

\Blade::directive('signup_done', function () {
    $condition = false;

    if (\Auth::check()) {
        if (\Auth::user()->signup_done) $condition = true;
    }

    return "<?php if ($condition) { ?>";
});

预期结果与实际结果

signup_done默认情况false下,对于每个用户,如果它更改为true我希望指令输出 true,但在我清除视图缓存之前它一直处于 false 状态。

标签: phplaravellaravel-blade

解决方案


Blade 正在缓存自定义指令的返回字符串,但如果该字符串是 PHP 代码,则会在访问缓存视图时对其进行评估。您可以做的是在返回字符串中包含整个条件逻辑,如下所示:

\Blade::directive('signup_done', function () {
    return "<?php if (\Auth::check() && \Auth::user()->signup_done) { ?>";
});

它可能不是最好的解决方案,但应该是可行的。


推荐阅读