سلام و عرض ادب
استاد اگر یک 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);
}
}