我有這個互動和存盤庫
<?php
namespace App\Domain\Model\User;
interface UserRepositoryInterface
{
public function findNextId(string $id = null): string;
public function findOneById(string $id): ?User;
public function findOneByEmail(string $email): ?User;
public function save(User $user): void;
public function remove(User $user): void;
}
final class DoctrineUserRepository implements UserRepositoryInterface {...}
現在根據 CQRS,我必須將我的回購分成 2 個回購。一個用于讀取,一個用于寫入模型,對嗎?所以將我的界面分成2個界面。
<?php
namespace App\Domain\Model\User;
interface UserRepositoryReadInterface
{
public function findNextId(string $id = null): string;
public function findOneById(string $id): ?User;
public function findOneByEmail(string $email): ?User;
}
And write:
<?php
namespace App\Domain\Model\User;
interface UserRepositoryWriteInterface
{
public function save(User $user): void;
public function remove(User $user): void;
}
并且應該創建DoctrineUserWriteRepository.php和DoctrineUserReadRepository.php. 那是對的嗎?我真的迷失了。紅噸的文章,但解釋絕對不清楚。
uj5u.com熱心網友回復:
好的,所以您在這里所做的是使用存盤庫模式來拆分您的代碼以實作CQRS架構。
我不知道為什么你應該使用存盤庫模式來做到這一點,因為在大多數情況下,使用的想法CQRS伴隨著DDD其他架構或等等。(我不會說應該這樣做,但基于我的經驗和與不同的團隊合作...)。
另一方面,如果您只是想使用存盤庫模式來獲得更好且更有條理的代碼,那么請繼續這樣做,但另一方面,您應該意識到,在大多數情況下,人們不喜歡過度工程化之類的東西這些案件,這些人不只是小輩。
無論如何,在這種情況下,我寧愿使用Services開始,所以這里有一個例子:
讓我們從安裝開始Ecotone,這是我個人在許多專案中使用和看到的(當然是大專案)。
composer require ecotone/laravel
然后你可以建立你的服務:
// I'll call this UserService since you've pointed to User in your repository pattern.
class UserService
{
#[CommandHandler]
public function save(SaveUserCommand $command) : void
{
// get user and save new info, create new one Or etc.
}
#[QueryHandler]
public function findOneByEmail(GetUserEmaillAddressQuery $query)
{
$userFoundOut= User::where(... or find or etc. // use the query
// to get user by email address or id or etc.;
return $userFoundOut;
}
}
在上面我們創建UserService的代碼query and command中,您可能會想為什么它們都在一個類中,我應該說,我與很多人一起作業,在許多專案中,我看到人們正在使用一個類,在其他一些場景中,他們使用兩個類來分隔query和command。
我寧愿將它們大體上拆分并做類似的事情UserQueryServices Or UserCommandServices,但另一方面,您可能會與像主要架構這樣的人一起作業,在這種情況下,他們將根據構建背景關系等決定做什么(以及這根本沒有任何問題,不要認為這個相同的班級想法是一個壞主意。)。
現在在控制器中查詢示例見下文:
class UserController
{
public function __construct(private QueryBus $queryBus) {}
public function getUserEmailAddress(Request $request)
{
$userId = $request->get('user_id');
$user = $this->queryBus->send(new GetUserEmaillAddressQuery($userId));
return new response($user->email);
}
}
class GetUserEmaillAddressQuery
{
public function __construct(private string $user_Id) {}
public function getUserId(): string
{
return $this->user_Id;
}
}
當然對于 Command :
class UserController
{
public function __construct(private CommandBus $commandBus) {}
public function saveUser(Request $request)
{
$userId = $request->get('user_id');
$name = $request->get('user_name');
$email = $request->get('user_email');
$something_cool= $request->get('something_cool');
$this->commandBus->send(new SaveUserCommand($userId, $name $email ,$something_cool));
return new response('done');
}
}
class SaveUserCommand
{
public function __construct(private string $user_id, private string $name,
private string $email, private string $something_cool) {}
public function getUserId(): string
{
return $this->user_id;
}
public function getEmail(): string
{
return $this->email;
}
public function getSomethingCool(): string
{
return $this->something_cool;
}
public function getName(): string
{
return $this->name;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/481956.html
