سلام و عرض ادب
آیا استفاده از این روش برای انتقال 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 واسه به اصطلاح سبک کردن مدل میتونه کار درست و منطقی باشه؟
ممنون میشم اگر کل این داستان یا قسمتیش مشکل داره دلیلش رو هم بفرمایین.