لاراول ۱۳ اکنون به شما اجازه می‌دهد تا ویژگی‌های $table ، $fillable و $casts را که اکثر مدل‌ها را شلوغ کرده‌اند، با ویژگی‌های (attributes) بومی PHP جایگزین کنید. این تغییر شامل بیش از ده ویژگی از فریم‌ورک می‌شود، از پیکربندی مدل گرفته تا شنونده‌های رویداد (event listeners) و mailables، و بدون از کار انداختن کدهای موجود عمل می‌کند.

چرا لاراول ویژگی‌های بومی (native attributes) را اضافه کرد

لاراول مدت‌هاست که به «رشته‌های جادویی» (magic strings) متکی بوده است – آرایه‌ای از نام ستون‌ها یا فیلدهای مخفی که در بالای یک کلاس مدل قرار می‌گیرند. این آرایه‌ها هیچ اشاره‌ای به شمای (schema) زیربنایی به IDE نمی‌دهند، بنابراین بازسازی (refactoring) نام یک ستون ممکن است بدون اینکه متوجه شوید از قلم بیفتد. با انتقال پیکربندی به کدهای واقعی و تایپ‌شده، لاراول راهی را به توسعه‌دهندگان می‌دهد تا بدنه کلاس را بر منطق تجاری (business logic) متمرکز نگه دارند و در عین حال به ویرایشگر اجازه دهند قابلیت‌های تکمیل خودکار (autocomplete)، بررسی نوع (type-checking) و ابزارهای تغییر نام (rename-refactor) را ارائه دهد.

فریم‌ورک ویژگی‌ها را از طریق PHP reflection API می‌خواند و نتیجه را کش (cache) می‌کند، بنابراین سربار زمان اجرا عملاً صفر است. مدل‌های موجود که بر پایه ویژگی‌ها (properties) هستند، دقیقاً همان‌طور که امروز کار می‌کنند به کار خود ادامه می‌دهند، که به این معنی است که می‌توانید نحو (syntax) جدید را به تدریج اتخاذ کنید.

آنچه به دست می‌آورید

  • پیکربندی تایپ‌شده (Typed configuration) – ویژگی‌ها آرگومان‌های تایپ‌شده را می‌پذیرند و رشته‌های جادویی را حذف می‌کنند. نام یک ستون را تغییر دهید و IDE تمام مکان‌هایی را که نیاز به به‌روزرسانی دارند، نشان می‌دهد.
  • بدنه کلاس‌های تمیزتر – تمام پیکربندی‌ها بالای نام کلاس قرار می‌گیرند؛ بدنه کلاس فقط شامل روابط (relationships)، اسکوپ‌ها (scopes) و متدها است.
  • تجربه بهتر در IDE – قابلیت تکمیل خودکار و تحلیل استاتیک روی آرگومان‌های ویژگی کار می‌کنند، چیزی که آرایه‌های رشته‌ای نمی‌توانند فراهم کنند.
  • بدون تغییرات مخرب (No breaking changes) – لاراول هم ویژگی‌های قدیمی و هم ویژگی‌های جدید را می‌خواند، بنابراین یک کدبیس ترکیبی بدون مشکل اجرا می‌شود.

راهنمای گام‌به‌گام مهاجرت

  1. مدلی که باید مهاجرت کند را شناسایی کنید
    فایل مدل را باز کنید. اگر ده‌ها خط اول توسط $table ، $fillable ، $hidden یا یک متد casts() اشغال شده است، این مدل کاندیدای مناسبی است.

  2. کلاس‌های ویژگی (attribute classes) را اضافه کنید
    در بالای فایل، کلاس‌های ویژگی مربوط به ویژگی‌هایی که جایگزین خواهید کرد را وارد (import) کنید (مثلاً Table ، Fillable ، Casts). لاراول این ویژگی‌ها را به صورت پیش‌فرض ارائه می‌دهد.

  3. اعلان‌های ویژگی (property declarations) را با ویژگی‌ها جایگزین کنید

    // Before
    protected $table = 'site_deployments';
    protected $fillable = ['site_id', 'server_id', 'status'];
    protected function casts(): array
    {
        return ['is_rollback' => 'boolean'];
    }
    
    // After
    #[Table('site_deployments')]
    #[Fillable(['site_id', 'server_id', 'status'])]
    #[Casts(['is_rollback' => 'boolean'])]
    class Deployment extends Model
    {
        // business logic only
    }
    

    نحو ویژگی‌ها مستقیماً بالای اعلان کلاس قرار می‌گیرد. پس از اطمینان از عملکرد ویژگی، ویژگی یا متد اصلی را حذف کنید.

  4. مجموعه تست‌ها را اجرا کنید
    تایید کنید که تخصیص انبوه (mass-assignment)، سریال‌سازی (serialization) و هرگونه casting سفارشی همچنان مانند قبل عمل می‌کنند. مدیریت ویژگی‌ها در لاراول کش می‌شود، بنابراین یک تست ناموفق معمولاً به یک غلط تایپی در آرگومان‌های ویژگی اشاره دارد.

  5. در دسته‌های کوچک کامیت و مستقر کنید
    مدل مهاجرت‌یافته را به یک شاخه ویژگی (feature branch) ارسال کنید، پس از عبور از خط لوله CI آن را ادغام کنید و در زیرمجموعه‌ای از سرورها مستقر کنید. از آنجایی که نحو ویژگی‌های قدیمی هنوز پشتیبانی می‌شود، هر ارجاع پراکنده باعث خطای زمان اجرا نخواهد شد.

  6. برای هر namespace تکرار کنید
    به جای بازنویسی کل کدبیس به صورت یک‌جا، یک گروه منطقی از مدل‌ها (مثلاً تمام موجودیت‌های مربوط به صورت‌حساب) را به ویژگی‌ها منتقل کنید، سپس برای گروه بعدی تکرار کنید. این کار دامنه آسیب (blast radius) هرگونه پس‌رفت (regression) را محدود می‌کند.

ابزارها و شبکه‌های ایمنی

  • Rector – یک ابزار بازسازی (refactoring) خودکار که می‌تواند نحو تکراری ویژگی‌ها را به ویژگی‌ها (attributes) تبدیل کند. آن را روی یک کپی از کدبیس اجرا کنید، تفاوت‌ها (diff) را بررسی کنید و تغییراتی را که درست به نظر می‌رسند اعمال کنید.
  • تست‌های خودکار – ابزارهای تست داخلی لاراول، اختلافات در تخصیص انبوه و خروجی JSON را شناسایی می‌کنند. آن‌ها را پس از هر مرحله مهاجرت سبز (موفق) نگه دارید.
  • پرچم‌های ویژگی (Feature flags) – اگر نیاز به بازگشت سریع دارید، استفاده از ویژگی‌های جدید را در پشت یک پرچم قرار دهید که بین پیکربندی قدیمی و جدید سوئیچ می‌کند.

چه زمانی ممکن است از مهاجرت صرف‌نظر کنید

اگر پروژه‌ای کوچک، پایدار و با تغییرات کم باشد، مزیت مدل‌های تمیزتر ممکن است با تلاش لازم برای تبدیل برابری نکند. نحو ویژگی‌ها اختیاری است؛ شما می‌توانید تا مدت‌ها از رویکرد کلاسیک ویژگی‌ها استفاده کنید. برعکس، برای اپلیکیشن‌هایی که به طور فعال در حال توسعه هستند، به ویژه آن‌هایی که مدل‌های بزرگ یا تغییرات مکرر در شمای (schema) دارند، اتخاذ ویژگی‌ها در مراحل اولیه اصطکاک‌های آینده را کاهش می‌دهد.

آنچه در آینده باید منتظر آن باشید

پشتیبانی از ویژگی‌ها در لاراول ۱۳ فراتر از مدل‌ها به شنونده‌های رویداد، اعلان‌ها (notifications)، mailables و رویدادهای پخش (broadcast events) گسترش می‌یابد. با پذیرش این نحو توسط جامعه در آن حوزه‌ها، الگوهای بازسازی مشابهی ظاهر خواهد شد. راهنمای رسمی ارتقا را برای هرگونه کلاس ویژگی جدید که در نسخه‌های فرعی آینده عرضه می‌شود، دنبال کنید.

نکته کلیدی: Laravel 13 مسیری بدون هزینه برای رسیدن به مدل‌های سبک‌تر و سازگارتر با IDE فراهم می‌کند. با تبدیل هر namespace به صورت جداگانه و تکیه بر Rector و مجموعه تست‌های خود، در نهایت به کلاس‌هایی خواهید رسید که به جای فایل‌های پر از تنظیمات، مانند مشخصات کسب‌وکار خوانده می‌شوند.