Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何加载Symfony';来自数据库的s配置参数(条令)_Php_Symfony - Fatal编程技术网

Php 如何加载Symfony';来自数据库的s配置参数(条令)

Php 如何加载Symfony';来自数据库的s配置参数(条令),php,symfony,Php,Symfony,我试图从数据库中加载参数,而不是在parameters.yml中硬编码参数。并非parameters.yml中的所有参数都需要从数据库中加载,只需加载一些参数,如paypal的api详细信息 在config.yml中,我导入了parameters.php imports: - { resource: parameters.php } 如果我在parameters.php中添加静态信息,就像下面的一样,效果很好 $demoName = 'First Last'; $container-&

我试图从数据库中加载参数,而不是在
parameters.yml
中硬编码参数。并非parameters.yml中的所有参数都需要从数据库中加载,只需加载一些参数,如paypal的api详细信息

config.yml
中,我导入了
parameters.php

imports:
    - { resource: parameters.php }
如果我在
parameters.php
中添加静态信息,就像下面的一样,效果很好

$demoName = 'First Last';
$container->setParameter('demoName', $demoName);
但是,我无法从数据库表中获取信息。我认为我应该创建类并使用
$em=this->getDoctrine()->getManager(),它应该可以工作,但不能,我得到的错误是

注意:未定义变量:paypal_data in/opt/lampp/htdocs/services/app/config/parameters.php(从“/opt/lampp/htdocs/services/app/config/config.yml”导入)。

这是我所做的尝试,如下所示,但代码似乎没有进入
\uu construct()


任何帮助都将不胜感激。

你做了错事。您需要声明编译器类并将其添加到容器中。整个集装箱装完后。。。在编译时,您将可以访问其中的所有服务

只需获取实体管理器服务并查询所需的参数,然后在容器中注册它们

逐步说明:

  • 定义编译器过程:

    # src/Acme/YourBundle/DependencyInjection/Compiler/ParametersCompilerPass.php
    class ParametersCompilerPass implements CompilerPassInterface
    {
        public function process(ContainerBuilder $container)
        {
            $em = $container->get('doctrine.orm.default_entity_manager');
            $paypal_params = $em->getRepository('featureBundle:paymentGateways')->findAll();
            $container->setParameter('paypal_data', $paypal_params);
        }
    }
    
  • 在bundle定义类中,需要向容器添加编译器传递

    # src/Acme/YourBundle/AcmeYourBundle.php
    class AcmeYourBundle extends Bundle
    {
        public function build(ContainerBuilder $container)
        {
            parent::build($container);
    
            $container->addCompilerPass(new ParametersCompilerPass(), PassConfig::TYPE_AFTER_REMOVING);
        }
    }
    

在我的Symfony 4中,带有
编译器类的解决方案不起作用,它仅在控制器中起作用,但在twig.yaml文件中使用时不起作用:

param_name: '%param_name%'
因为我需要在侧边栏中使用这个参数,所以在所有页面中,从控制器传递它是不可行的

这就是我所做的,这要感谢您可以将其作为全局细枝变量

我有一个名为“设置”的服务,它直接从数据库加载设置,简化了:

class Settings
{
    /** @var \PDO */
    private $db;

    public function __construct(EntityManagerInterface $em)
    {
        $this->db = $this->em->getConnection();
    }

    /**
     * Gets a setting value. 
     * If the setting doesn't exist, returns the default value specified as second param
     */
    public function get(string $name, $default=''): string
    {
            $stmt = $this->db->prepare("SELECT `value` FROM `settings` WHERE `key`=?;");
            $stmt->execute([$name]);
            return $stmt->fetchColumn() ?: $default;
    }

    /**
     * Sets a setting value. 
     * If the setting doesn't exists, it creates it. Otherwise, it replaces the db value
     */
    public function set(string $name, string $value, string $description = '')
    {
        $this->db->prepare("INSERT INTO settings (`key`, `value`, `description`) VALUES (?,?,?) ON DUPLICATE KEY UPDATE `value`=?;")
            ->execute([$name, $value, $description, $value]);
    }
现在,我只是在
config/packages/twig.yaml
中添加了:

twig:
    # ...
    globals:
        # ...
        settings: '@App\Service\Settings'
这很神奇,因为现在我可以从任何模板读取任何db设置:

{{ dump(settings.get('setting_name')) }}

我发布的设置类被简化了,它仍然可以得到改进,例如,如果您多次请求相同的设置,则可以避免再次进行相同的查询,但这并不重要(将获取的密钥存储在
private$fetched
数组中)

您是否尝试将$paypal_数据设置为类作用域为
$this-paypal_data
?是的,我也尝试过,也许您需要实例化parameters对象?这肯定行不通。控制器用于将请求转换为响应,而不是仅用于需要某些逻辑的任何地方。您不能在配置解析中使用任何服务,在这个阶段您仍然在配置容器,您还不能使用它。您对PHP中的OO也有一些误解。我确信我并没有试图实现以前从未实现过的目标。我所要做的不是在config.yml中硬编码paypal凭证,只需允许用户在管理面板中定义它们,并且无论用户定义了什么值,都可以在config.ymlthanks中使用它们来获得详细答案,我将在添加生成函数后与您联系。我收到错误
试图加载类“ParametersCompilerPass”从名称空间“ClickTeck\featuresBundle”。您忘记了另一个名称空间的“use”语句了吗?
所以我添加了
use
语句,并指向
ParametersCompilerPass()
,这导致了
自动加载程序预期类的另一个错误“ClickTeck\featuresBundle\DependencyInjection\Compiler\ParametersCompilerPass”将在文件中定义“/opt/lampp/htdocs/services/src/ClickTeck/featuresBundle/DependencyInjection/Compiler/ParametersCompilerPass.php“
。找到了文件,但类不在其中,类名或命名空间可能有输入错误。`而且我似乎无法理解类型在哪里,我已交叉检查了文件名和类。如果您在数据库中进行了更改,则参数不会因缓存的容器而更改,有解决此问题的方法吗?请在更新设置实体时清除缓存
{{ dump(settings.get('setting_name')) }}