desmart/laravel-domain-core

DeSmart 核心领域驱动设计(DDD)包用于 Laravel

0.7.1 2016-11-03 11:30 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:26:12 UTC


README

将模型实体化

模型应使用 DeSmart\DomainCore\ConvertsToEntityTrait。它提供了 toEntity() 方法,尝试将模型转换为实体。

实体类名称

实体类名称基于模型类名称。这里的约定是

Module\Model\SomeModel -> Module\Entity\SomeModelEntity

实体类名称可以更改。只需在模型定义中设置 $entityClassName 属性。

向实体传递数据

模型被转换为数组,并通过 JsonMapper 设置所有实体属性。

向实体传递相关模型

toEntity() 还会将相关模型映射到适当的实体。
这与 JsonMapper 类似。

如果需要,可以通过专用方法将一些关系进行转换。只需在您的模型中创建 [relationName]ToEntity 方法。

一对一关系必须在实体中表示为类型提示的可变参数(请参见以下示例)。

示例

<?php
class User extends \Illuminate\Database\Eloquent\Model
{
    use ConvertsToEntityTrait;

    public function files()
    {
        return $this->hasMany(File::class);
    }

    public function bio()
    {
        return $this->hasOne(Bio::class);
    }

    public function avatar()
    {
        return $this->files()
            ->where('is_avatar', 1);
    }

    public function avatarToEntity(File $avatar, UserEntity $user)
    {
        return new Avatar($file->toEntity());
    }
}

class UserEntity
{
    public function setFiles(FileEntity ...$files)
    {
        $this->files = $files;
    }

    public function setBio(BioEntity $bio) 
    {
        $this->bio = $bio;
    }

    public function setAvatar(Avatar $avatar)
    {
        $this->avatar = $avatar;
    }
}

查询集合

示例

<?php

class UserEntitiesRepository
{
    use ConvertsCollectionToEntitiesTrait;

    /** @var User */
    private $query;
    
    public function __construct(User $user)
    {
        $this->query = $user;
    }
    
    /**
     * @param CriteriaCollectionInterface $criteriaCollection
     * @return UserEntity[]
     */
    public function getAllMatching(CriteriaCollectionInterface $criteriaCollection) 
    {
        /** @var \Illuminate\Database\Eloquent\Builder $builder */
        $builder = $this->getQueryBuilder();

        $queryBuilder = $builder->getQuery();
        $queryBuilder->select($this->query->getTable() . '.*');

        foreach ($criteriaCollection->getAll() as $criterion) {
            $criterion->apply($builder);
        }

        $collection = $builder->get();

        return $this->convertCollectionToEntities($collection);
    }
}

class WithIdsCriterion implements \DeSmart\DomainCore\Repository\Criteria\CriterionInterface
{
    /** @var array */
    protected $ids;

    /**
     * @param array $ids
     */
    public function __construct(array $ids)
    {
        $this->ids = $ids;
    }

    /**
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return mixed
     */
    public function apply($query)
    {
        $idsList = array_map(function ($id) {
            return "'{$id}'";
        }, $this->ids);

        $query->whereIn($query->getModel()->getQualifiedKeyName(), $this->ids);

        if (false === empty($idsList)) {
            $query->orderBy(\DB::raw("FIELD ({$query->getModel()->getQualifiedKeyName()}," . implode(',', $idsList) . ")"));
        }

        return $query;
    }
}

$criteriaCollection = new \DeSmart\DomainCore\Repository\Criteria\CriteriaCollection();
$usersRepository = new UsersRepository(new User());
$criteriaCollection->add(
    new WithIdsCriterion([1, 2, 3])
);

$users = $usersRepository->getAllMatchingCriteria($criteriaCollection);