zfstarter/zfs-domain-model

为ZFStarter提供的Zend Framework 2 Zend\Db的DBAL替代实现

1.0.3 2015-04-01 13:16 UTC

This package is not auto-updated.

Last update: 2024-09-24 07:47:34 UTC


README

为ZF2/ZFStarter项目提供的基于Zend\Db的数据库访问层的替代实现。

连接

  • 在配置中添加服务自动创建Gateway的工厂
'service_manager' => array(
    'factories' => array(
        'ZFS\DomainModel\Service' => 'ZFS\DomainModel\Service\Factory'
    )
)
  • 添加对数据库默认连接的别名
'service_manager' => array(
    'aliases' => array(
        // допустим, у нас есть подключение к БД как 'Db\Adapter'
        // чтоб ZFS\DomainModel могла его использовать по-умолчанию, делаем алиас:
        'ZFS\DomainModel\Adapter' => 'Db\Adapter'
    )
)

使用

唯一需要的操作

  • 创建用于创建Gateway的抽象工厂
<?php
namespace Application\Model\Gateway;

use ZFS\DomainModel\Gateway\AbstractFactory as BaseAbstractFactory;

class AbstractFactory extends BaseAbstractFactory
{
    protected $provides = array(
        'UsersGateway' => array(
            'tableName' => 'users'
        )
    );
}
  • 并将此工厂添加到ServiceManager的设置中
'service_manager' => array(
    'abstract_factories' => array(
        'Application\Model\Gateway\AbstractFactory'
    )
)

现在我们可以通过服务定位器(以控制器为例)来访问Gateway

/** @var \ZFS\DomainModel\Gateway\TableGateway $gateway */
$gateway = $this->getServiceLocator()->get('UsersGateway');

该库创建了一个ZFS\DomainModel\Gateway\TableGateway,连接到表'users',使用ZFS\DomainModel\ResultSet\ResultSet作为select操作结果的原型,并使用ZFS\DomainModel\Object\ObjectMagic作为表格抽象的原型。最后,它包含用于访问行数据的__get__set魔法方法。

扩展使用

每个Gateway的抽象工厂可以定义多个在ZFS\DomainModel\Service\Options中定义的选项

const OPTION_TABLE_GATEWAY        = 'tableGateway';         // имя класса, создается через new
const OPTION_TABLE_NAME           = 'tableName';            // имя таблицы, единственное обязательное поле
const OPTION_ADAPTER              = 'adapter';              // имя, доступное через ServiceLocator
const OPTION_TABLE_FEATURES       = 'tableFeatures';        // массив из обьектов ***Feature
const OPTION_RESULT_SET_PROTOTYPE = 'resultSetPrototype';   // имя класса, создается через new
const OPTION_OBJECT_PROTOTYPE     = 'objectPrototype';      // имя класса, создается через new
const OPTION_SQL                  = 'sql';                  // имя класса, создается через new

每个类必须继承自ZFS\DomainModel中相应的类,OPTION_OBJECT_PROTOTYPE至少需要实现ZFS\DomainModel\Object\ObjectInterface。除了接口之外,程序员还可以使用ZFS\DomainModel\Object\ObjectZFS\DomainModel\Object\ObjectMagic。第一个对于喜欢通过方法编写getter和setter的人来说很有用

<?php
namespace Application\Model\Object;

use ZFS\DomainModel\Object\Object;

class User extends Object
{
    protected $primaryColumns = array(
        'id'
    );

    public function getId()
    {
        return $this->data['id']; // напрямую из массива данных
    }

    public function getName()
    {
        return $this->get('name'); // использует настройку $fieldToColumnMap, а так же возвращает null если isset($this->data[$name]) == false 
    }
}

第二个更简洁。使用__get__set来访问字段,在内部使用$this->get()(如上例所示)和$this->set()

<?php
namespace Application\Model\Object;

use ZFS\DomainModel\Object\ObjectMagic;

/**
 * @property int    id
 * @property string name
 */
class User extends ObjectMagic
{
    protected $primaryColumns = array(
        'id'
    );
}

推荐使用PHPDoc @property至少用于自动完成。

为了帮助使用camelCase编程风格和数据库列的underscore命名,可以使用参数$fieldToColumnMap

<?php
namespace Application\Model\Object;

use ZFS\DomainModel\Object\ObjectMagic;

/**
 * @property int    id
 * @property string name
 * @property string dateOfBirth
 */
class User extends ObjectMagic
{
    protected $primaryColumns = array(
        'id'
    );

    protected $fieldToColumnMap = array(
        'dateOfBirth' => 'date_of_birth'
    );
}

可以使用ZFS\DomainModel\Feature\FilterColumnsFeature过滤掉数组$data中不必要的字段(对于ObjectMagic很有用),这些字段不在原始表中,只需将其添加到Gateway的描述中即可

<?php
namespace Application\Model\Gateway;

use ZFS\DomainModel\Feature\FilterColumnsFeature;
use ZFS\DomainModel\Gateway\AbstractFactory as BaseAbstractFactory;
use ZFS\DomainModel\Service\Options;

class AbstractFactory extends BaseAbstractFactory
{
    public function __construct()
    {
        $this->provides['UsersGateway'] = array(
            Options::OPTION_TABLE_NAME       => 'users',
            Options::OPTION_TABLE_FEATURES   => array(new FilterColumnsFeature()),
            Options::OPTION_OBJECT_PROTOTYPE => 'Application\Model\Object\User'
        );
    }
}

在这里,如所示,选项的键来自Options,定义已移动到构造函数中,因为需要创建FilterColumnsFeature的实例,并使用上述示例中的Application\Model\Object\User

许可证

MIT