t4web/domain-module

ZF2 实现域的模块。

安装数量: 1,488

依赖项: 5

建议者: 0

安全性: 0

星标: 2

关注者: 4

分支: 0

开放问题: 0

类型:zf2-module

1.5.0 2019-05-13 12:46 UTC

README

主分支: Build Status codecov.io Scrutinizer Code Quality

ZF2 实现域和基础设施的模块。提供动态配置的域层。

主要设置

通过克隆项目

  1. 将此项目克隆到您的 ./vendor/ 目录。

使用 composer

  1. 在您的 composer.json 中添加此项目
"require": {
    "t4web/domain-module": "~1.3.0"
}
  1. 现在运行以下命令让 composer 下载 DomainModule
$ php composer.phar update

安装后

  1. 在您的 application.config.php 文件中启用它。
<?php
return array(
    'modules' => array(
        // ...
        'T4web\DomainModule',
    ),
    // ...
);

快速开始

描述实体

class Task extends \T4webDomain\Entity {
    protected $name;
    protected $assigneeId;
    protected $status;
    protected $type;

    /**
     * @var Users\User\User
     */
    protected $assignee;

    public function __construct(array $data, Users\User\User $assignee = null) {
        parent::__construct($data);
        $this->assignee = $assignee;
    }

    /**
     * @return Users\User\User
     */
    public function getAssignee() {
        return $this->assignee;
    }
}

在您的 module.config.php 中描述 entity_map 配置

return [
    // ...
    
    'entity_map' => [
        'Task' => [
            // table name
            'table' => 'tasks',

            // optional, only if you have use short service names
            'entityClass' => 'Tasks\Task\Task',
            
            // optional, only if you have use short service names
            'collectionClass' => 'Tasks\Task\TaskCollection',

            // optional, by default 'id'
            'primaryKey' => 'id',

            // map entity field with table field
            'columnsAsAttributesMap' => [
                'id' => 'id',
                'name' => 'name',
                'assigneeId' => 'assignee_id',
                'status' => 'status',
                'type' => 'type',
            ],

            // optional, aliases for criteria - for pretty query args
            'criteriaMap' => [
                'id' => 'id_equalTo'
            ],

            // optional, relations for filtering and fetching aggregate entity
            'relations' => [
                'User' => ['tasks.assignee_id', 'users.id']
            ],
        ],
    ],
];

您可以从 ServiceManager 获取域层

// in your controller
$creator = $serviceLocator->get('Task\Service\Creator');

$task = $creator->create(['name' => 'buy milk', 'type' => 2]);

if (!$task) {
    return ['errors' => $creator->getMessages()];
}

$repository = $serviceLocator->get('Task\Infrastructure\Repository');
/** @var Tasks\Task\Task $task */
$task = $repository->findById(123);

$repository = $serviceLocator->get('Task\Infrastructure\AggregateRepository');
$task = $repository->findWith('User')->findById(123);
/** @var Users\User\User $assignee */
$assignee = $task->getAssignee();

组件

  • MODULE-NAME\ENTITY-NAME\Infrastructure\Repository
  • MODULE-NAME\ENTITY-NAME\Service\Creator
  • MODULE-NAME\ENTITY-NAME\Service\Deleter
  • MODULE-NAME\ENTITY-NAME\Service\Updater
  • MODULE-NAME\ENTITY-NAME\EntityFactory

服务类

  • MODULE-NAME\ENTITY-NAME\Infrastructure\Config
  • MODULE-NAME\ENTITY-NAME\Infrastructure\Mapper
  • MODULE-NAME\ENTITY-NAME\Infrastructure\QueryBuilder

我们建议使用简短的服务名称 - 不包含模块名称

  • ENTITY-NAME\Infrastructure\Repository
  • ENTITY-NAME\Service\Creator
  • ENTITY-NAME\Service\Deleter
  • ENTITY-NAME\Service\Updater
  • ENTITY-NAME\EntityFactory

服务类

  • ENTITY-NAME\Infrastructure\Config
  • ENTITY-NAME\Infrastructure\Mapper
  • ENTITY-NAME\Infrastructure\QueryBuilder

当您使用简短的服务名称时,需要提供 entityClass 配置参数。