سلام و عرض ادب
استاد اگر یک interface تعریف کنیم و بعد یک کلاس ابسترکت که اون interface رو implement کنه و بعدش concrete کلاسهامون از اون کلاس ابسترکت extend کنن بهتر نیست؟
اینجوری همه کلاسها مجبورن متدی که توی interface تعریف شده رو پیاده سازی کنن و کدمون rubostتر بشه.
به طور مثال:
۱- اینترفیس:
namespace App\\Services\\DashboardUser\\DashboardRegisterStepIndicator\\Contracts; use App\\Models\\User; interface DashboardRegisterStepIndicatorInterface { public function setNextIndicator(DashboardRegisterStepIndicatorInterface $indicator); public function indicate(User $superAdmin); }
۲- ابسترکت
namespace App\\Services\\DashboardUser\\DashboardRegisterStepIndicator\\Contracts; use App\\Enums\\User\\DashboardRegisterStep; use App\\Models\\User; abstract class AbstractDashboardRegisterStepIndicator implements DashboardRegisterStepIndicatorInterface { private $nextIndicator; public function setNextIndicator(DashboardRegisterStepIndicatorInterface $indicator) { return $this->nextIndicator = $indicator; } public function indicate(User $superAdmin) { if ($this->nextIndicator === null) { return $this->makeResult(DashboardRegisterStep::Complete, true); } return $this->nextIndicator->indicate($superAdmin); } public function makeResult(DashboardRegisterStep $step, bool $isComplete = false) { return [ 'is_complete' => $isComplete, 'step' => $step, 'step_name' => DashboardRegisterStep::tryFrom($step->value)?->text(), ]; } }
۳- کلاس concrete:
class IsEmailVerified extends AbstractDashboardRegisterStepIndicator { public function indicate(User $superAdmin) { if (! $superAdmin->hasVerifiedEmail()) { return $this->makeResult(DashboardRegisterStep::EmailNotVerified); } return parent::indicate($superAdmin); } }