如何在非Symfony应用中读取Symfony 6.4配置文件的定义数组
如何在非Symfony项目中读取Symfony 6.4的PHP配置数组(Hacky实现)
核心思路
通过模拟Symfony的ContainerConfigurator及其关联类,捕获配置文件中通过parameters()->set()设置的参数,同时保证原Symfony应用的加载不受任何影响。
步骤1:创建模拟的Symfony配置类
我们需要在非Symfony项目中,创建与Symfony原生类同名同命名空间的模拟类,利用PHP的自动加载优先级(Symfony项目中会优先加载框架自带的类,非Symfony项目则加载我们的模拟类)来实现兼容。
1.1 创建ContainerConfigurator类
创建目录结构:Symfony/Component/DependencyInjection/Loader/Configurator/,然后新建ContainerConfigurator.php:
<?php namespace Symfony\Component\DependencyInjection\Loader\Configurator; class ContainerConfigurator { private $parameters; public function __construct() { $this->parameters = new ParametersConfigurator(); } public function parameters(): ParametersConfigurator { return $this->parameters; } // 静态方法用于外部获取捕获到的参数 public static function getCapturedParameters(): array { return ParametersConfigurator::$capturedParams; } }
1.2 创建ParametersConfigurator类
在同一目录下新建ParametersConfigurator.php:
<?php namespace Symfony\Component\DependencyInjection\Loader\Configurator; class ParametersConfigurator { // 静态属性存储捕获到的所有参数 public static $capturedParams = []; public function set(string $key, mixed $value): void { self::$capturedParams[$key] = $value; } }
步骤2:加载配置文件并提取参数
在非Symfony项目的代码中,按以下方式加载原Symfony配置文件并获取目标数组:
<?php // 手动加载我们的模拟类(如果用Composer自动加载,可跳过这两行,只需把模拟类目录加入autoload) require_once 'Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php'; require_once 'Symfony/Component/DependencyInjection/Loader/Configurator/ParametersConfigurator.php'; // 加载Symfony的PHP配置文件,得到闭包函数 $configClosure = require 'path/to/your/symfony-config-file.php'; // 实例化模拟的ContainerConfigurator $containerConfig = new Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator(); // 执行配置闭包,参数会被自动捕获到模拟类的静态属性中 $configClosure($containerConfig); // 提取目标配置数组 $sampleConfigs = Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator::getCapturedParameters()['my.sample_configs']; // 验证结果(按需使用) var_dump($sampleConfigs);
兼容性说明
原Symfony应用的加载完全不受影响:
- 在Symfony项目中,框架自带的
ContainerConfigurator和ParametersConfigurator会被Composer自动加载器优先加载,我们的模拟类根本不会被引入; - 配置文件中的闭包逻辑与原Symfony的加载逻辑完全一致,没有任何修改,因此原应用的配置加载流程正常运行。
内容的提问来源于stack exchange,提问作者pgr
相关产品推荐
相关产品推荐

