desmart / laravel-domain-core
DeSmart 核心领域驱动设计(DDD)包用于 Laravel
0.7.1
2016-11-03 11:30 UTC
Requires
- php: >=5.6.0
- illuminate/container: ^5.2
- illuminate/database: ^5.2
- illuminate/events: ^5.2
- illuminate/log: ^5.2
- illuminate/support: ^5.2
- netresearch/jsonmapper: 0.10.*
- psr/log: ^1.0
Requires (Dev)
- phpspec/phpspec: ^2.4
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);