问题描述
现在,我正在Symfony4中开发一个应用程序,用户可以使用一个参数创建文件,该参数可以在各种选项(这些选项已定义)之间选择,例如:
Year = [2020,2019,2018,2017];
Type = ['A','B','C'];
User = [
'User' => 'ROLE_USER','Admin' => 'ROLE_ADMIN','Guest' => 'ROLE_GUEST',];
我希望管理员可以通过添加新的年份或添加新的文件类型来更改此变量。 因此,我认为可以通过为整个应用程序创建一个全局变量(可以从任何地方访问的变量)以在表单,视图等中使用它来实现。但是我不知道该怎么做。 我想我可以通过两种方式做到这一点:
我该怎么办? 还有其他更简单的方法来实现这一目标吗?
非常感谢您
解决方法
通常,我将这些值保存在“设置”表中并使用高速缓存,因此不必每次使用它们时都对数据库进行调用。
- 创建实体设置,它将具有3个属性:年份,类型,用户。 (它们可以是json类型)
- 我在数据库中手动创建了1个原始数据并添加了值,管理员可以通过表格来更新这些值
- 我创建了一个SettingCache类,每次管理员提交表单时,值都会更改,因此我清除了缓存:
$settingCache->getSetting('years')
。 - 下次我调用
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 \ Cache \ SettingCache
public function findAllToArray() {
return $this->createQueryBuilder('s')
->where('s.id = 1')
->getQuery()
->getOneOrNullResult(AbstractQuery::HYDRATE_ARRAY);
}
App \ Repository \ SettingRepository.php
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);
}
}
就是这样!
但是因为我也想轻松地在twig中访问这些值,所以我创建了一个TwigFunction:
App \ Twig \ SettingExtension
{% for year in setting('years') %}
{{ year }}
{% endfor %}
所以我可以在类似的模板中调用它
{{1}},
答案实际上取决于这些变量将改变的频率。以及解决方案的预算。
数据库解决方案非常灵活,但是创建,迁移和维护花费更多时间。它还需要一个用户界面才能更新变量。
对应项是具有公共静态函数的Settings类,该函数返回这些变量。很快每当需要更改这些变量时,都将需要程序员+应用程序的部署。