باس ارتباطی ماژولها
باس ارتباطی ماژولها یک زیرساخت ارتباطی ماژولار برای پروژه Planet است که بر اساس الگوهای Command Query Separation (CQS) و CQRS طراحی شده است. این سیستم روشی قدرتمند و غیروابسته برای ارتباط ماژولها با یکدیگر بدون وابستگیهای مستقیم فراهم میکند.
سیستم باس چیست؟
سیستم باس یک لایه ارتباطی است که به ماژولهای مختلف برنامه امکان میدهد از طریق یک رابط استاندارد با یکدیگر تعامل داشته باشند. این سیستم اصل Command Query Separation (CQS) را پیادهسازی میکند که بیان میدارد متدها باید یا یک عمل را انجام دهند (Command) یا داده برگردانند (Query)، اما نه هر دو.
سیستم باس یک مؤلفه معماری اصلی است که جداسازی تمیز دغدغهها را اجرا میکند و اتصال سست بین ماژولها را ترویج میدهد.
ویژگیهای کلیدی
- جداسازی کامل Command و Query: Commandها هرگز داده برنمیگردانند، Queryها هرگز وضعیت را تغییر نمیدهند
- اتصال سست: ماژولها وابستگی مستقیم به یکدیگر ندارند
- ثبت صریح: کنترلکنندهها به صورت صریح ثبت میشوند بدون کشف خودکار
- ایمنی نوع: ایمنی کامل نوع با ویژگیهای PHP 8.1+
- مدیریت خطای جامع: مدیریت خطای استاندارد در تمام ماژولها
- قابلیت تست بالا: به راحتی میتوان کنترلکنندهها را mock کرد و اجزا را به صورت مستقل آزمایش کرد
چه زمانی از سیستم باس استفاده کنیم
در موارد زیر باید از سیستم باس استفاده کنید:
- نیاز به ارتباط بین ماژولهای مختلف دارید
- میخواهید جداسازی واضحی بین commandها و queryها اعمال کنید
- به روشی استاندارد برای مدیریت خطاها و پاسخها نیاز دارید
- میخواهید قابلیت تست کد خود را بهبود دهید
- نیاز به حفظ اتصال سست بین اجزا دارید
اجزای اصلی
سیستم باس از اجزای اصلی زیر تشکیل شده است:
قراردادها (رابطها)
BusMessage: رابط پایه برای تمام پیامهاCommandInterface: رابط نشانگر برای CommandهاQueryInterface: رابط نشانگر برای QueryهاBusResponseInterface: ساختار پاسخ استانداردCommandBusInterface: قرارداد برای CommandBusQueryBusInterface: قرارداد برای QueryBus
پیادهسازیها
InMemoryCommandBus: پیادهسازی همزمان CommandBusInMemoryQueryBus: پیادهسازی همزمان QueryBusBusSuccessResponse: پاسخ موفقیت با الگوی شیء مقدار تغییرناپذیرBusErrorResponse: پاسخ خطا با اعتبارسنجی
شروع سریع
در اینجا یک مثال سریع از نحوه استفاده از سیستم باس آمده است:
// Controller
class UserController extends Controller
{
public function __construct(
private readonly CommandBusInterface $commandBus,
private readonly QueryBusInterface $queryBus
) {}
public function show(int $id): JsonResponse
{
$query = new GetUserByIdQuery($id);
$response = $this->queryBus->dispatch($query);
if ($response->isSuccess()) {
return response()->json(['data' => $response->getData()]);
}
return response()->json(['error' => $response->getErrorMessage()], 404);
}
public function store(Request $request): JsonResponse
{
$command = new CreateUserCommand(
$request->input('name'),
$request->input('email'),
$request->input('password')
);
$this->commandBus->dispatch($command);
return response()->json(['message' => 'User created'], 201);
}
}
مراحل بعدی
برای یادگیری بیشتر درباره سیستم باس، راهنماهای زیر را بررسی کنید:
- معماری - توضیح دقیق معماری سیستم باس
- راهنمای پیادهسازی - نحوه پیادهسازی سیستم باس در ماژولهای خود
- بهترین شیوهها - استانداردهای کدنویسی و بهترین شیوهها
- مثالها - مثالهای عملی استفاده از سیستم باس