سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ پویا پارسایی
آیا استفاده از decorator برای انتقال accessorهای مدلهای لاراولی به یک کلاس دیگر کار درستی است؟
جامعه مهندسی نرم افزار ایجاد شده در ۰۳ اردیبهشت ۱۴۰۲

سلام و عرض ادب

آیا استفاده از این روش برای انتقال accessor ها، mutatorها و یا حتی متد هایی که درون مدل دارن به دیتابیس query میزنن کار درستیه؟

به طور مثال مدل زیر رو در نظر بگیرین:

namespace App\\Models;
use Illuminate\\Foundation\\Auth\\User as Authenticatable;
use Illuminate\\Database\\Eloquent\\Casts\\Attribute;
class User extends Authenticatable
{
    public function FormattedDob(): Attribute
   {
        return new Attribute(
            get: fn () => $this->dob->format('Y-m-d')
        );
    }
    public function hasAnyOrganisation(): bool{
        return $this->organisations()->exists();
    }  
}

به جای این، بیایم یه decorator بنویسیم و اونجا ازشون استفاده کنیم:


namespace App\\Services\\UserService;
use App\\Models\\User;
use Illuminate\\Database\\Eloquent\\Casts\\Attribute;
class UserPresenter
{
    public function __construct(private User $user)
   {
    }
    public function getFormattedDob(): string
   {
        return $this->dob->format('Y-m-d');
    }
    public function hasAnyOrganisation(): bool
   {
        return $this->user->organisations()->exists();
    }
}

و در نهایت هم هر جا خواستیم ازش استفاده کنیم به این صورت عمل کنیم:

namespace App\\Http\\Resources\\User;
use Illuminate\\Http\\Resources\\Json\\JsonResource;
use App\\Services\\UserService\\UserPresenter
class UserShowResource extends JsonResource
{
    public function toArray($request)
    {
        $userPresenter = new UserPresenter($this);
        return [
            'id' => $this->id,
            'dob' => $userPresenter->getFormattedDob(),
            'has_organisation' => $userPresenter->hasAnyOrganisation()
        ];
    }
}

البته این صرفا یه مثال بود و فقط میخوام بدونم که کلا استفاده از decorator واسه به اصطلاح سبک کردن مدل میتونه کار درست و منطقی باشه؟

ممنون میشم اگر کل این داستان یا قسمتیش مشکل داره دلیلش رو هم بفرمایین.

سلام خدمت شما. اصل Decorator برای سبک کردن یک کلاس نیست بلکه برای اضافه کردن یک رفتار یا تغییر اون می‌تونه استفاده بشه. اینجا به این صورت که یک Presenter نوشته شده منظور این بوده خیلی از کارها رو به عنوان رفتار می‌تونیم بهش نگاه کنیم که در داخل Presenter نوشته بشه. نگاه به عنوان Formatter یا چیزی شبیه اون نبوده. قاعدتا استفاده از اون کلاس‌های Resource می‌تونه گزینه بهتری برای تغییر فرمت داده‌ها باشه.

کیوان علی محمدی ۰۴ اردیبهشت ۱۴۰۲، ۱۲:۰۸