Zend Framework 2配置问题:旧项目环境配置迁移与读取方法
嘿,我刚好有过ZF1迁移到ZF2的实战经验,给你一步步捋清楚怎么实现对应的配置和读取逻辑:
一、配置文件的位置与写法
ZF2抛弃了ZF1的.ini配置格式,改用PHP数组格式的配置文件,主要分为全局配置和模块专属配置两类:
1. 全局配置(通用/敏感配置)
放在项目根目录的config/autoload/文件夹下,一般拆分为两个文件:
global.php:存放通用的、不敏感的配置(比如数据库驱动、库名、主机),可以提交到版本控制local.php:存放环境专属的敏感配置(比如数据库密码),这个文件建议加入.gitignore,不提交版本控制
对应你旧项目里的数据库配置,写法如下:
// config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo', 'dsn' => 'mysql:dbname=test;host=127.0.0.1', 'username' => 'root', 'driver_options' => [ PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ], ], ];
// config/autoload/local.php return [ 'db' => [ 'password' => 'adm$123', ], ];
2. 模块专属配置(模块逻辑、自定义配置)
每个模块的配置放在自身的config/module.config.php里,比如你的Application模块,路径就是module/Application/config/module.config.php。这里可以放控制器注册、视图配置,还有你自定义的theme、copyright这类配置:
// module/Application/config/module.config.php return [ // 注册控制器(替代ZF1的controllerDirectory配置) 'controllers' => [ 'invokables' => [ 'Application\Controller\Index' => 'Application\Controller\IndexController', // 其他控制器都需要在这里注册,格式:「模块名\控制器名」 => 完整类名 ], ], // 视图相关配置 'view_manager' => [ 'display_exceptions' => true, // 对应旧项目的resources.frontController.params.displayExceptions 'template_path_stack' => [ 'application' => __DIR__ . '/../view', // 视图文件存放路径 ], ], // 自定义的配置项,和旧项目的theme、copyright对应 'application_settings' => [ 'theme' => 'Test', 'copyright' => 'TestText', ], ];
3. PHP环境设置(对应phpSettings)
ZF2不再通过配置文件设置PHP环境参数,直接在入口文件public/index.php里设置更直接:
// public/index.php error_reporting(0); ini_set('display_startup_errors', 0); ini_set('display_errors', 0); // 后面是ZF2的默认入口代码...
二、读取配置的方法
ZF2通过**服务管理器(ServiceManager)**来统一管理配置,在控制器或模块初始化逻辑里都能轻松获取:
1. 在控制器中读取
如果你的控制器继承了Zend\Mvc\Controller\AbstractActionController,可以直接获取服务管理器来读取配置:
// 比如IndexController的indexAction方法 public function indexAction() { // 获取全局配置数组 $config = $this->getServiceLocator()->get('Config'); // 取出自定义的配置项 $theme = $config['application_settings']['theme']; $copyright = $config['application_settings']['copyright']; // 赋值给视图,和旧项目的assign效果一致 $this->layout()->theme = $theme; $this->layout()->copyright = $copyright; return new ViewModel(); }
2. 全局注入视图(更高效)
如果所有视图都需要用到theme和copyright,可以在模块的Module.php的onBootstrap方法里一次性注入,不用每个控制器都写:
// module/Application/Module.php use Zend\Mvc\MvcEvent; class Module { public function onBootstrap(MvcEvent $e) { $application = $e->getApplication(); $serviceManager = $application->getServiceManager(); $config = $serviceManager->get('Config'); // 获取视图模型,把配置赋值给全局视图 $viewModel = $e->getViewModel(); $viewModel->theme = $config['application_settings']['theme']; $viewModel->copyright = $config['application_settings']['copyright']; } // 加载模块配置的默认方法 public function getConfig() { return include __DIR__ . '/config/module.config.php'; } }
这样在任何视图文件里,直接用$this->theme和$this->copyright就能调用了,和旧项目的用法完全一致。
补充说明
- ZF2的
Bootstrap.php逻辑被替换成了Module.php的onBootstrap方法,旧项目里Bootstrap的初始化代码要移到这里或者对应的工厂类中 - ZF2的控制器必须通过
controllers.invokables(或工厂)注册,不能像ZF1那样直接指定目录,这是核心区别之一
内容的提问来源于stack exchange,提问作者Евгений
相关产品推荐
相关产品推荐

