如何在Apigility中为多个版本设置不同的数据库/数据库适配器



In Apigility

数据库

连接服务允许[...]指定数据库适配器[...]

(请参阅文档中的 REST 服务教程)。

"数据库连接"服务提供Database Settings,其中可以分配适配器。每个适配器都"知道"要使用哪些凭据以及要连接哪个数据库。

我创建了一个"代码连接"的 REST 服务,并希望版本 V1V2 使用单独的数据库。如何实现这一点?

为了使用多个数据库适配器,只需要一个

  1. 在(global.php用于常规设置(如凭据的driverlocal.php)中创建适当的配置块 - 可以手动或通过Apugility GUI完成(Dashboard -> Database Adapters

全球.php

return array(
    'db' => array(
        'adapters' => array(
            'DB\myapi_v1' => array(
                'driver' => 'Pdo',
                'driver_options' => array(
                    1002 => 'SET NAMES 'UTF8'',
                ),
                'pdodriver' => 'mysql',
            ),
            'DB\myapi_v2' => array(
                ...
            ),
        ),
    ),
    ...
);

本地.php

return array(
    'db' => array(
        'adapters' => array(
            'DB\myproject_v1' => array(
                'username' => 'root',
                'password' => 'pwd',
                'dbname' => 'myproject_v1',
                'host' => 'localhost',
            ),
            'DB\myproject_v2' => array(
                ...
            ),
        ),
    ),
    ...
);
  1. 设置此适配器而不是默认ZendDbAdapterAdapter,例如使用 ZfcBaseMapper(这里是应用程序中的示例,其中适配器在出厂时为 service 类设置;service这里是 controller/resourceDB mapper之间的层):

[myproject]/module/Portfolio/src/Portfolio/V1/Rest/Image/ImageServiceFactory.php

namespace PortfolioV1RestImage;
use ZendServiceManagerFactoryInterface;
use ZendServiceManagerServiceLocatorInterface;
class ImageServiceFactory implements FactoryInterface {
    public function createService(ServiceLocatorInterface $serviceManager) {
        $mapper = new ImageMapper;
        $mapper->setDbAdapter($serviceManager->get('DB\myproject_v1'));
        $mapper->setEntityPrototype($serviceManager->get('PortfolioV1RestImageImageEntity'));
        $mapper->getHydrator()->setUnderscoreSeparatedKeys(false);
        $service = new ImageService();
        $service->setMapper($mapper);
        return $service;
    }
}

最新更新