چطور اتریبیوتهای PHP نوشتن Livewire رو عوض کرد
خلاصهٔ کاملتر
نویسنده میگه سالهاست کامپوننتهای Livewire مینویسه و عاشق این فریمورکه، چون کاری که برای full-stack PHP میکنه رو هیچ ابزار دیگهای نکرده: ساختن UI واقعاً تعاملی بدون خارجشدن از زبونی که دوست داره. ولی به گفتهٔ خودش کامپوننتها یه بوی بد داشتن: بالای هر کلاس یه دیوار متادیتا بود؛ یه $rules اینجا، یه $listeners اونجا، یه $queryString یه گوشه، و یه mount() که سه کار مختلف میکرد. منطق کامپوننت زیر کانفیگ خودش دفن میشد.
مشکل اصلی این بود که این تیکهها کاملاً از هم جدا بودن: قانون ولیدیشن $title ده خط پایینتر از خودِ $title بود، و listener مربوط به refresh() فقط یه رشته تو یه آرایه بود، دور از خود متد. هیچی به IDE نمیگفت اینها به هم ربط دارن. بعد اتریبیوتهای PHP اومدن و Livewire هم روشون حساب باز کرد و نویسنده میگه دیگه نمیتونه برگرده.
همون کامپوننت با روش جدید نصف میشه و مهمتر اینکه هر تیکه متادیتا به همون چیزی میچسبه که واقعاً دربارشه:
class CreatePost extends Component
{
#[Validate('required|min:3|max:255')]
public string $title = '';
#[Url]
public string $search = '';
#[On('post-saved')]
public function refresh() { /* ... */ }
}قانون ولیدیشن درست بالای پراپرتیه، listener درست بالای متده و سینک با URL درست بالای پراپرتی مربوطه. دیگه لازم نیست نقشهٔ ذهنی نگه داری؛ کد رو از بالا به پایین میخونی و معنی همونجاست. نویسنده میگه این فقط زیبایی نیست: وقتی بعد از ماهها یه کامپوننت رو باز میکنه، با یه نگاه میفهمه هر پراپرتی چیکار میکنه، چون #[Validate]، #[Url]، #[Locked]، #[Session] هرکدوم همون لحظه میگن اون پراپرتی چه ویژگی خاصی داره.
اتریبیوت موردعلاقهٔ نویسنده #[Computed] ـه: نتیجهٔ یه متد رو برای طول همون ریکوئست کش میکنه، پس اگه تو ویو دهبار به $this->user دسترسی بگیری بازم فقط یهبار به دیتابیس میزنه؛ کاری که قبلاً باید با پراپرتی خصوصی و lazy initialization دستی میساختی.
یه بردِ کمتر گفتهشده هم اینه که PHPStorm اتریبیوتها رو میفهمه: میشه رو #[Validate] کلیک کرد و به کلاسش پرید، رو #[Locked] هاور کرد و داکبلاکش رو خوند، و ابزار آنالیز استاتیک خطاهای آرگومانها رو میگیره و rename موقع ریفکتور روشون کار میکنه. برخلاف رشتهٔ $listeners، رابطه حالا ساختاریه نه اتفاقی، چون اتریبیوت یه متادیتاست که خودِ زبون میفهمتش و فریمورکها میتونن با reflection درست بخوننش. نتیجهگیری نویسنده اینه که هر فیچر جدید زبون لزوماً برد نیست، ولی اتریبیوتها یه مشکل واقعی رو حل کردن و تمیزترین PHP تعاملیای هستن که تا حالا نوشته.
نکات کلیدی:
- اتریبیوتها متادیتا رو کنار همون پراپرتی یا متدی میذارن که بهش مربوطه
- کد کامپوننت نصف و خودمستند میشه؛ دیگه پرش ذهنی تو فایل لازم نیست
- #[Computed] نتیجه رو برای طول ریکوئست کش میکنه و از کوئری تکراری جلوگیری میکنه
- IDE و ابزار آنالیز استاتیک اتریبیوتها رو میفهمن، چون رابطه ساختاریه نه یه رشته تو آرایه
- اتریبیوت متادیتاییه که خودِ زبون میفهمه و با reflection قابلخوندنه




