Zend Framework多数据库连接实现咨询:请求提供实操示例
我之前在做Zend Framework项目的时候也碰到过需要连接多个数据库的需求,特意整理了不同版本的实操示例,你可以直接参考套用:
Zend Framework 多数据库连接实操示例
Zend Framework 1.x 实现方式
第一步:配置多数据库连接
在项目的application/configs/application.ini配置文件中,添加多个数据库的连接参数:
; 默认数据库(设置为默认适配器) resources.db.adapter = "PDO_MYSQL" resources.db.params.host = "localhost" resources.db.params.username = "root" resources.db.params.password = "your_password" resources.db.params.dbname = "default_database" resources.db.isDefaultTableAdapter = true ; 第二个数据库(命名为blog_db) resources.db.blog.adapter = "PDO_MYSQL" resources.db.blog.params.host = "localhost" resources.db.blog.params.username = "root" resources.db.blog.params.password = "your_password" resources.db.blog.params.dbname = "blog_database"
第二步:在模型/控制器中调用非默认数据库
模型中直接绑定指定数据库
class Model_Blog extends Zend_Db_Table_Abstract { protected $_name = 'posts'; // 对应blog_database中的posts表 protected $_adapter = 'blog'; // 对应配置文件中定义的blog节点 // 也可以手动获取连接做自定义操作 public function getBlogConnection() { return Zend_Registry::get('db')->getAdapter('blog'); } }
控制器中直接调用
public function indexAction() { // 获取第二个数据库连接 $blogDb = Zend_Registry::get('db')->getAdapter('blog'); // 执行查询 $posts = $blogDb->fetchAll($blogDb->select()->from('posts')); $this->view->posts = $posts; }
Zend Framework 3 / Laminas 实现方式
ZF3之后采用依赖注入容器(DI)管理资源,配置和调用更规范:
第一步:配置多数据库连接
在config/autoload/local.php中添加数据库适配器配置:
return [ 'db' => [ 'adapters' => [ // 默认数据库适配器 'DefaultDb' => [ 'driver' => 'Pdo_Mysql', 'database' => 'default_database', 'username' => 'root', 'password' => 'your_password', 'hostname' => 'localhost', ], // 第二个数据库适配器 'BlogDb' => [ 'driver' => 'Pdo_Mysql', 'database' => 'blog_database', 'username' => 'root', 'password' => 'your_password', 'hostname' => 'localhost', ], ], ], ];
第二步:在控制器中通过依赖注入使用
编写控制器工厂类注入适配器
// module/Blog/src/Controller/PostControllerFactory.php namespace Blog\Controller; use Interop\Container\ContainerInterface; use Laminas\ServiceManager\Factory\FactoryInterface; class PostControllerFactory implements FactoryInterface { public function __invoke(ContainerInterface $container, $requestedName, array $options = null) { // 从容器中获取两个数据库适配器 $defaultDb = $container->get('DefaultDb'); $blogDb = $container->get('BlogDb'); // 注入到控制器 return new PostController($defaultDb, $blogDb); } }
在控制器中使用适配器
// module/Blog/src/Controller/PostController.php namespace Blog\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\Db\Adapter\AdapterInterface; class PostController extends AbstractActionController { protected $defaultDb; protected $blogDb; public function __construct(AdapterInterface $defaultDb, AdapterInterface $blogDb) { $this->defaultDb = $defaultDb; $this->blogDb = $blogDb; } public function indexAction() { // 使用BlogDb查询博客文章 $posts = $this->blogDb->query( 'SELECT * FROM posts', AdapterInterface::QUERY_MODE_EXECUTE )->toArray(); // 使用DefaultDb查询用户信息 $users = $this->defaultDb->query( 'SELECT * FROM users', AdapterInterface::QUERY_MODE_EXECUTE )->toArray(); return ['posts' => $posts, 'users' => $users]; } }
第三步:在模型中结合TableGateway使用
如果用TableGateway封装模型,同样可以指定适配器:
// module/Blog/src/Model/PostTableFactory.php namespace Blog\Model; use Interop\Container\ContainerInterface; use Laminas\Db\TableGateway\TableGateway; use Laminas\ServiceManager\Factory\FactoryInterface; class PostTableFactory implements FactoryInterface { public function __invoke(ContainerInterface $container, $requestedName, array $options = null) { // 指定使用BlogDb适配器 $dbAdapter = $container->get('BlogDb'); $resultSetPrototype = new PostResultSet(); $resultSetPrototype->setArrayObjectPrototype(new Post()); return new TableGateway('posts', $dbAdapter, null, $resultSetPrototype); } }
内容的提问来源于stack exchange,提问作者srigu
相关产品推荐
相关产品推荐

