可以在整个 symfony 应用程序中使用的变量? - 交响乐 4

Variables that can be used in the whole symfony app? - Symfony 4

所以现在我正在 Symfony4 中开发一个应用程序,用户可以使用一个参数创建文件,该参数可以在各种选项(这些选项已经定义)之间进行选择,例如:

Year = [2020,2019,2018,2017];
Type = ['A','B','C'];
User = [
  'User' => 'ROLE_USER',
  'Admin' => 'ROLE_ADMIN',
  'Guest' => 'ROLE_GUEST',
];

我希望管理员可以通过添加新的年份或添加新的文件类型来更改此变量。 所以我认为这可以通过为整个应用程序创建一个全局变量(一个可以从任何地方访问的变量)来实现,以便在表单、视图等中使用它。但我不知道该怎么做。 我想我可以通过两种方式做到这一点:

我该怎么办? 还有其他更简单的方法吗?

非常感谢您

通常我将这些值保存在 table“设置”中并使用缓存,这样我就不必在每次需要使用它们时都调用数据库。

  • 创建实体设置,它将有 3 个属性:年份、类型、用户。 (可以是json类型)
  • 我在数据库中手动创建 1 个 raw 并添加值,管理员有一个表单来更新这些值
  • 我创建了一个 SettingCache class,每次管理员提交表单时,值都会改变,所以我清除了缓存:$settingCache->clear().
  • 下次我调用 $settingCache->getSetting('years') 时,它将调用数据库以获取新值并重建缓存。

App\Cache\SettingCache

namespace App\Cache;

use App\Repository\SettingRepository;
use Psr\Cache\InvalidArgumentException;
use Symfony\Contracts\Cache\CacheInterface;

/*
 * Cache keys:
 *  - settings
 */
class SettingCache
{
    private $cache;
    private $settingRepository;

    public function __construct(
        CacheInterface $cache,
        SettingRepository $settingRepository
    ) {
        $this->cache = $cache;
        $this->settingRepository = $settingRepository;
    }

    public function getSettings(): array {
        return $this->cache->get('settings', function() {
            return $this->settingRepository->findAllToArray();
        });
    }

    public function getSetting(string $key) {
        $settings = $this->getSettings();
        return $settings[$key] ?? null;
    }

    public function clear(): void {
        $this->cache->delete('settings');
    }
}

App\Repository\SettingRepository.php

public function findAllToArray() {
    return $this->createQueryBuilder('s')
        ->where('s.id = 1')
        ->getQuery()
        ->getOneOrNullResult(AbstractQuery::HYDRATE_ARRAY);
}

就是这样!
但是因为我也想轻松访问树枝中的这些值,所以我创建了一个 TwigFunction :

App\Twig\SettingExtension

namespace App\Twig;

use App\Cache\SettingCache;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class SettingExtension extends AbstractExtension
{
    private $settingCache;

    public function __construct(SettingCache $settingCache) {
        $this->settingCache = $settingCache;
    }

    public function getFunctions(): array
    {
        return [
            new TwigFunction('setting', [$this, 'getSetting']),
        ];
    }

    public function getSetting(string $key) {
        return $this->settingCache->getSetting($key);
    }
}

所以我可以在像

这样的模板中调用它
{% for year in setting('years') %}
    {{ year }}
{% endfor %}

答案实际上取决于这些变量改变的频率。以及解决方案的预算。

数据库解决方案非常灵活,但需要花费更多时间来创建、迁移和维护。它还需要一个用户界面才能更新变量。

对应的是 class 设置和 public 静态函数,returns 这些变量。它很快。每当需要更改这些变量时,都需要程序员 + 部署应用程序。