从数据库加载symfony(5.2)配置 [英] Load Symfony (5.2) config from database

查看:5
本文介绍了从数据库加载symfony(5.2)配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是symfony的新手,但我知道如何在PHP中使用OOP。 我尝试通过使用Doctrine实体将自定义参数与symfony配置相结合。

解决我使用的问题,例如Michael Sivolobov:https://stackoverflow.com/a/28726681/2114615和其他来源的答案。

我的解决方案:

第1步:在配置文件夹中创建新包

-> config
  -> packages
   -> project
   -> services.yaml
   -> project
    -> src
    -> ParameterLoaderBundle.php
    -> DependencyInjection
     -> Compiler
     -> ParameterLoaderPass.php

第二步:导入新资源

# config/services.yaml
...
imports:
    - { resource: 'packages/project/config/services.yaml' }
...

第三步:包编码

# packages/project/config/services.yaml

services:
    Project:
        resource: "../src"
<?php

namespace Project;

use ProjectDependencyInjectionCompilerParameterLoaderPass;
use SymfonyComponentDependencyInjectionCompilerPassConfig;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentHttpKernelBundleBundle;

class ParameterLoaderBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        parent::build($container);

        $container->addCompilerPass(new ParameterLoaderPass(), PassConfig::TYPE_AFTER_REMOVING);
    }
}
<?php

namespace ProjectDependencyInjectionCompiler;

use AppEntitySettingCategory;
use SymfonyComponentDependencyInjectionCompilerCompilerPassInterface;
use SymfonyComponentDependencyInjectionContainerBuilder;

class ParameterLoaderPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $em = $container->get('doctrine.orm.default_entity_manager');
        $setting = $em->getRepository(SettingCategory::class)->findAll();
        $container->setParameter('test', $setting);
    }
}

在测试完API控制器中的新参数后:

$this->getParameter('Test');

但出现以下错误消息:

The parameter "test" must be defined.

推荐答案

这里发生了几件事。首先,从数据库加载配置在symfony中非常不寻常,因此遇到困难也就不足为奇了。其次,您的进程代码永远不会被调用。调试的一部分是确保预期被调用的代码实际上已被调用。第三,尝试在配置下添加一个捆绑包真的离题了。很久以前,在symfony 2中,app/config下有更多与捆绑包相关的东西,可能是你发现了一些旧文章,并对它们产生了误解。

但是,这里的大问题是symfony有一个所谓的"编译"阶段,该阶段基本上处理所有配置并将其缓存。因此,我们使用了CompilerPassInterface。遗憾的是,服务本身在编译阶段不可用。它们只是还不存在,所以没有实体管理器。如果您确实想要从数据库加载配置,则需要打开您自己的数据库连接。您将只希望使用数据库连接对象,而不是实体管理器,因为编译阶段的一部分是处理实体本身。

所以去掉所有代码,只需调整您的内核类:

# src/Kernel.php
class Kernel extends BaseKernel implements CompilerPassInterface
{
    use MicroKernelTrait;

    public function process(ContainerBuilder $container)
    {
        $url = $_ENV['DATABASE_URL'];
        $conn = DriverManager::getConnection(['url' => $url]);

        $settings = $conn->executeQuery('SELECT * FROM settings')->fetchAllAssociative();
        $container->setParameter('test',$settings);
    }
请注意,即使所有这些都正常工作,您也需要在更新设置表后手动重新构建symfony缓存。这不会是自动的。你真的可以考虑采取一种完全不同的方法。

这篇关于从数据库加载symfony(5.2)配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆