effiana / config-bundle
将数据库存储的设置通过服务提供给您的Symfony项目。
Requires
- php: ^7.2
- craue/formflow-bundle: ^3.2
- doctrine/doctrine-bundle: ^1.11 | ^2.0
- effiana/migration-bundle: dev-master
- symfony/framework-bundle: ~4.3 | ^5.0
- twig/twig: ^3.0
Requires (Dev)
- doctrine/instantiator: ^1.0.5
- doctrine/orm: ^2.5.14
- phpunit/phpunit: ^6.5.13|^7.5.1
- roave/security-advisories: dev-master
- symfony/phpunit-bridge: ~3.4|~4.1 | ^5.0
- symfony/symfony: ~3.4|~4.1 | ^5.0
README
ConfigBundle管理存储在数据库中的配置设置,并通过服务在您的Symfony项目中使其可访问。这些设置类似于在parameters.yml
中定义的设置,但可以在运行时进行修改,例如由管理员用户修改。
安装
获取包
在shell中运行以下命令,让Composer下载并安装包:
php composer.phar require effiana/config-bundle:~2.2
in a shell.
启用包
// in app/AppKernel.php public function registerBundles() { $bundles = [ // ... new Effiana\ConfigBundle\EffianaConfigBundle(), ]; // ... }
创建表
您可以通过调用
# in a shell
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
或
# in a shell
php bin/console doctrine:schema:update
或您喜欢的任何方式完成此操作。
添加管理设置的路由(可选)
您可以选择导入默认的路由配置
# in app/config/routing.yml effiana_config_settings: resource: "@EffianaConfigBundle/Resources/config/routing/settings.xml" prefix: /settings
...或添加自己的以完全控制URL模式。
# in app/config/routing.yml effiana_config_settings_modify: path: /settings/modify defaults: _controller: Effiana\ConfigBundle\Controller\SettingsController::modifyAction
需要一些CSS来正确渲染表单。将资源安装到您的项目中
# in a shell
php bin/console assets:install --symlink web
使用方法
定义设置
此包不提供创建新设置的函数,因为这在运行时没有意义。这些设置将在您的应用程序中使用,因此需要编写代码。这意味着您必须自己创建数据库表effiana_config_setting
中的新设置,例如使用迁移。
管理设置的值
如果您添加了上述路由,您可以通过简单的表单管理所有定义的设置的值。默认情况下,您可以通过浏览到app_dev.php/settings/modify
来访问该表单。但您可能希望在安全配置中限制对表单的访问。
读取设置
该包提供了一个名为effiana_config
的服务。在控制器中,您可以调用
$this->get('effiana_config')->get('name-of-a-setting')
来检索设置name-of-a-setting
的值。此外,您可以调用
$this->get('effiana_config')->all()
来获取所有定义的设置及其值的关联数组。
$this->get('effiana_config')->getBySection('name-of-a-section')
将只获取指定部分(或明确传递null
作为名称时没有部分的)设置。
写入设置
使用相同的服务,您可以设置设置的新的值
$this->get('effiana_config')->set('name-of-a-setting', 'new value'); $this->get('effiana_config')->setMultiple(['setting-1' => 'foo', 'setting-2' => 'bar']);
请注意,设置必须存在,否则将抛出异常。
在Twig模板中使用
此包中的Twig扩展支持直接在模板中读取设置。
{{ effiana_setting('name-of-a-setting') }}
启用缓存(可选)
为了减少数据库查询次数,您可以设置设置的缓存。首先,您必须选择您想要使用的缓存实现。目前,有适配器可用于
有关详细信息,请参阅每个实现的文档,并在下面的相应部分中继续阅读。完成操作后,ConfigBundle
将自动缓存设置(使用内置的effiana_config_cache_adapter
服务)。
请注意,在修改应用程序之外修改设置(例如,通过Doctrine迁移)后,请清除缓存(如果需要)
# in a shell
php bin/console doctrine:cache:clear effiana_config_cache
缓存实现:DoctrineCacheBundle
设置参数effiana_config.cache_adapter.class
并配置一个名为effiana_config_cache_provider
的缓存提供者
# in app/config/config.yml parameters: effiana_config.cache_adapter.class: Effiana\ConfigBundle\CacheAdapter\DoctrineCacheBundleAdapter doctrine_cache: providers: effiana_config_cache: apc: ~ namespace: effiana_config aliases: - effiana_config_cache_provider
缓存实现:Symfony Cache组件
设置参数effiana_config.cache_adapter.class
并配置一个名为effiana_config_cache_provider
的缓存池
# in app/config/config.yml parameters: effiana_config.cache_adapter.class: Effiana\ConfigBundle\CacheAdapter\SymfonyCacheComponentAdapter services: effiana_config_cache_provider: class: Symfony\Component\Cache\Adapter\FilesystemAdapter public: false arguments: - 'effiana_config' - 0 - '%kernel.cache_dir%'
自定义
在提交内置表单后重定向到不同的页面
如果您已启用内置表单,您可以通过设置目标路由名称来定义成功保存更改后的重定向位置
# in app/config/parameters.yml parameters: effiana_config.redirectRouteAfterModify: effiana_config_settings_modify
在部分中渲染设置
如果您想在组(此处称为部分)中渲染设置,您必须为这些设置分配一个公共的部分名称(在数据库中)。可选地,您可以影响这些部分的顺序。
# in app/config/parameters.yml parameters: effiana_config.configTemplate.sectionOrder: [section1, section2, section3]
没有部分的设置将首先渲染。没有显式排序的部分将最后渲染。
翻译
您可以通过将它们添加到具有ConfigBundle
域的翻译文件中,为要在表单中显示的所有设置(和部分)添加翻译,例如:
# in app/Resources/ConfigBundle/translations/ConfigBundle.en.yml name-of-a-setting: name of the setting # in app/Resources/ConfigBundle/translations/ConfigBundle.de.yml name-of-a-setting: Name der Einstellung
使用自定义实体进行设置
自定义实体必须提供对字段value
的映射。类BaseSetting
定义了此字段,但没有为它提供映射。这允许轻松覆盖,包括数据类型。在下面的示例中,value
字段将被映射到一个text
列,这将进一步将内置表单字段渲染为textarea
。
因此,创建实体及其相应的映射
// src/MyCompany/MyBundle/Entity/MySetting.php use Effiana\ConfigBundle\Entity\BaseSetting; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="Effiana\ConfigBundle\Repository\SettingRepository") * @ORM\Table(name="my_setting") */ class MySetting extends BaseSetting { /** * @var string|null * @ORM\Column(name="value", type="text", nullable=true) */ protected $value; /** * @var string|null * @ORM\Column(name="comment", type="string", nullable=true) */ protected $comment; public function setComment($comment) { $this->comment = $comment; } public function getComment() { return $this->comment; } }
并让包了解它
# in app/config/config.yml effiana_config: entity_name: MyCompany\MyBundle\Entity\MySetting