jihel / dynamic-parameter-bundle
一个SF2扩展包,用于将数据库中的参数注册到容器中
Requires
- php: >=5.3.3
- doctrine/orm: >=2.4
- symfony/symfony: >=2.4
This package is not auto-updated.
Last update: 2024-09-24 03:02:59 UTC
README
Symfony 2 允许您从文件中访问参数,但您需要从数据库中访问呢?此扩展包将在加载其他任何内容之前创建所有键。
您还可以从apache vhost环境变量中加载特定命名空间的一组参数。
1- 安装
将插件添加到您的composer.json require中
{
"require": {
"jihel/dynamic-parameter-bundle": "dev-master",
}
}
或
php composer.phar require jihel/dynamic-parameter-bundle
通过使用扩展包提供的Kernel类更新您的AppKernel.php,并注册它
use Jihel\Plugin\DynamicParameterBundle\HttpKernel\Kernel;
...
public function registerBundles()
{
$bundles = array(
...
new Jihel\Plugin\DynamicParameterBundle\JihelPluginDynamicParameterBundle(),
);
}
添加到您的parameter.yml
parameters:
jihel.plugin.dynamic_parameter.table_prefix: whatever # can be '' for no prefix, will be 'jihel_' by default
安装数据库表
php app/console doctrine:schema:update
可选
您可以在vhost配置中定义一些命名空间键以加载。
有两个键
- SYMFONY__JIHEL__PLUGIN__DYNAMIC_PARAMETER__ALLOWED_NAMESPACES
- SYMFONY__JIHEL__PLUGIN__DYNAMIC_PARAMETER__DENIED_NAMESPACES
您可以使用逗号分隔符指定多个命名空间。请求是关联的,您可以指定允许和拒绝的命名空间。
示例
<VirtualHost *:80>
ServerName Symfony2
DocumentRoot "/path/to/symfony_2_app/web"
DirectoryIndex index.php index.html
SetEnv SYMFONY__JIHEL__PLUGIN__DYNAMIC_PARAMETER__ALLOWED_NAMESPACES firstModule
SetEnv SYMFONY__JIHEL__PLUGIN__DYNAMIC_PARAMETER__DENIED_NAMESPACES firstOption,secondOption
<Directory "/path/to/symfony_2_app/web">
AllowOverride All
Allow from All
</Directory>
</VirtualHost>
2- 配置缓存管理
parameters.yml
jihel.plugin.dynamic_parameter.dynamic_parameter_cache: ['env'|true|false]
'env'值将在生产环境中使用缓存,true将随时启用它。
3- 使用
将参数键添加到您的数据库中。您可以创建自己的CRUD,但默认的CRUD已经存在,只需将路由添加到您的routing.yml文件中即可启用
JihelPluginDynamicParameterBundle:
resource: '@JihelPluginDynamicParameterBundle/Resources/config/routing.yml'
prefix: /jihel
您将只能看到可见在您的命名空间中,并且具有列isEditable为true的键
*/!\ 当您直接从数据库更新键时,您必须清理缓存 /!* 如果您使用后端/前端逻辑具有两个分开的缓存,您必须在每次修改后使用命令来清理
php app/console jihel:parameter:purge-cache
如果使用提供的控制器,键将自动失效(在当前缓存中)。否则,您将必须像这样使用服务 jihel.plugin.dynamic_parameter.loader.parameter 和 jihel.plugin.dynamic_parameter.cache.parameter
/** @var \Jihel\Plugin\DynamicParameterBundle\DependencyInjection\Loader\ParameterLoader $parameterLoader */
$parameterLoader = $this->get('jihel.plugin.dynamic_parameter.loader.parameter');
$dynamicParameters = $parameterLoader->load(true);
/** @var \Jihel\Plugin\DynamicParameterBundle\DependencyInjection\Cache\ParameterCache $parameterCache */
$parameterCache = $this->get('jihel.plugin.dynamic_parameter.cache.parameter');
$parameterCache->createCache($dynamicParameters, true);
4- 注意
显然,如果您加载具有相同名称的多个键,则只有一个将被注册 ... 注意您执行键添加的位置,如果您使用后端/前端应用程序分离,则可能需要手动清理缓存,因此请小心。
5 - 重要!
您必须知道vhost中的环境参数将不再被缓存,或者至少,除了在服务定义之外(是的,我知道 ...)。
Symfony2在缓存中将参数键替换为它们的原始值。因此,您不能在项目之间共享源代码的情况下在依赖注入系统中使用动态参数。提供了一个带有服务 jihel.plugin.dynamic_parameter.loader.environment 的环境变量的解决方案。
要使用它们,一个可能的解决方案是将服务容器(是的,我知道 ... 再次)直接注入到您的服务中,而不是仅注入键。
我希望改变它的执行方式,但完全重写PhpDumper可能不是一个干净的解决方案。所以,像往常一样,与那些该死的私有和非受保护的功能(你知道在SF2中有很多 ...)打交道,处理它,注入容器,但像这样在使用后丢弃。
public function __construct(Container $container)
{
$this->myDynamicParameter = $container->getParameter('jihel.dynamic.myDynamic');
}
您还可能遇到一些与缓存管理(共享模板等)相关的问题,作为一个简单的解决方案,您可以创建每个域的缓存目录。
/**
* {@inheritdoc}
*
* @api
*/
public function getCacheDir()
{
if (!isset($_SERVER['HTTP_HOST'])) {
return $this->rootDir.'/../var/cache/'.$this->environment;
}
$dir = $this->rootDir.'/../var/cache/'.$this->sanitiseDomainName($_SERVER['HTTP_HOST']);
if (!is_dir($dir)) {
mkdir($dir, 0777, true);
}
return $dir.DIRECTORY_SEPARATOR.$this->environment;
}
/**
* Remove all subdomain in the name
*
* @param string $name
* @return string
*/
public function sanitiseDomainName($name)
{
$exp = explode('.', $name);
$length = $exp[count($exp)-1] === 'pp' ? -3 : -2;
return strtolower(implode('.', array_splice($exp, $length)));
}
优点
- 快速解决方案
缺点
- 没有缓存预热
- inode消耗
6- 感谢
感谢我抽出空闲时间给懒惰的开发者上课程。您可以在这里访问并阅读我的简历