php - 在映射器中注入(inject)数据库适配器

标签 php mysql zend-framework2 laminas-api-tools

我对如何在映射器类中注入(inject)(Zend/Apigility)与以下映射器有关的特定数据库适配器(此处名为音乐)感到非常困惑:

AlbumMapper.php

<?php
namespace music\V1\Rest\Album;

use Zend\Db\Sql\Select;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Paginator\Adapter\DbSelect;

class AlbumMapper
{
    protected $adapter;
    public function __construct(AdapterInterface $adapter)
    {
        $this->adapter = $adapter;
    }

    public function fetchAll()
    {
        $select = new Select('album');
        $paginatorAdapter = new DbSelect($select, $this->adapter);
        $collection = new AlbumCollection($paginatorAdapter);
        return $collection;
    }

    public function fetchOne($id)
    {
        $sql = 'SELECT * FROM album WHERE id = ?';
        $resultset = $this->adapter->query($sql, array($id));
        $data = $resultset->toArray();
        if (!$data) {
            return false;
        }

        $entity = new AlbumEntity();
        $entity->exchangeArray($data[0]);
        return $entity;
    }
}

模块.php

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'music\V1\Rest\Album\AlbumMapper' =>  function ($sm) {
                $adapter = $sm->get('Zend\Db\Adapter\Adapter');
                return new \music\V1\Rest\Album\AlbumMapper($adapter);
            },
        ),
    );
}

AlbumResourceFactory.php

<?php
namespace music\V1\Rest\Album;

class AlbumResourceFactory
{
    public function __invoke($services)
    {
        $mapper = $services->get('music\V1\Rest\Album\AlbumMapper');
        return new AlbumResource($mapper);
    }
}

这将从 config/autoload/user.global.php 文件中获取数据库适配器凭据,根据此文件注释,这在生产模式下不是适当的方式。

最佳答案

我认为正确的解决方案涉及编辑 Module.php 文件:

public function getServiceConfig()
{
    $dbParams = array(
        'database'  => 'music',
        'username'  => 'root',
        'password'  => 'myPassword',
        'hostname'  => 'localhost',
    );

    return array(
        'factories' => array(
            'music\V1\Rest\Album\AlbumMapper' =>  function ($sm) use ($dbParams) {
                $adapter = new \Zend\Db\Adapter\Adapter(array(
                    'driver'    => 'pdo',
                    'dsn'       => 'mysql:dbname='.$dbParams['database'].';host='.$dbParams['hostname'],
                    'database'  => $dbParams['database'],
                    'username'  => $dbParams['username'],
                    'password'  => $dbParams['password'],
                    'hostname'  => $dbParams['hostname'],
                ));
                return new \music\V1\Rest\Album\AlbumMapper($adapter);
            },
        ),
    );
}

如果有更好的解决方案,我愿意接受建议,但这可行。

关于php - 在映射器中注入(inject)数据库适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34459440/

相关文章:

php - 查询表,但获取首先列出的特定 id

php - MySQL PDO 行数

rest - 如何从 Zend Framework 2 中的 ServiceManger 获取请求对象?

php - MYSQL 日期时间 - PHP 转换

php - 找不到类 'MongoId'(Zend Framework with MongoDB Doctrine)

php - Zend 框架 2 : No base path provided

php - 如果代码中有任何错误,如何将值插入到数据库表中?

PHP 相等变量

PHP - 在对象内调用函数会导致错误 : 'Call to a member function query() on integer in'

mysql - 如何在MySQL表中添加外键列?