zfstarter / zfs-domain-model
为ZFStarter提供的Zend Framework 2 Zend\Db的DBAL替代实现
Requires
- php: >=5.3.23
- zendframework/zend-db: 2.3.*
- zendframework/zend-servicemanager: 2.3.*
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\Object
和ZFS\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