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')) }}