Tempest 2 و خداحافظی با down migration
خلاصهٔ کاملتر
تو Tempest 2، اینترفیس DatabaseMigration که هر مایگریشن رو مجبور میکرد هم متد up() و هم down() داشته باشه حذف شده. قبلاً اگه یکی از این دو تا لازم نبود، باید null برمیگردوندی. Brent، نویسندهٔ مقاله، میگه این طراحی از اول از Laravel الهام گرفته شده بود و جزو بخشهای خیلی قدیمی Tempest بود که هیچوقت عوض نشده بود. خوشبختانه فرایند ارتقا به نسخهٔ ۲ خودکاره.
جرقهٔ این تغییر یه پست از Freek (از تیم Spatie) بود که توضیح میده چرا سالهاست down migration نمینویسن. ایدهٔ اصلی forward-only migration هست، یعنی هیچوقت تاریخچهٔ دیتابیس رو برعکس نمیکنی و اگه چیزی باید برگرده، یه مایگریشن جدید مینویسی که رو به جلو درستش کنه. نویسنده هم موافقه: نوشتن up درست خودش سخته، نوشتن down سازگار، اونم وقتی مایگریشن روی پروداکشن اجرا شده، یه سطح سختتره.
حالا بهجای اون اینترفیس، دو تا اینترفیس جدا داریم: MigratesUp و MigratesDown. روش پیشنهادی اینه که فقط MigratesUp رو پیاده کنی:
final class CreateStoredEventTable implements MigratesUp
{
public string $name = '2025-01-01-create_stored_events_table';
public function up(): QueryStatement
{
return CreateTableStatement::forModel(StoredEvent::class)
->primary()
->text('uuid');
}
}یه فایدهٔ جانبی هم داره: دیگه نوع برگشتی متدها nullable نیست و up() مستقیم یه QueryStatement برمیگردونه. اگه واقعاً بخوای، هنوز میتونی هر دو اینترفیس رو روی یه کلاس پیاده کنی و تو down() مثلاً یه DropTableStatement برگردونی.
چرا MigratesDown فعلاً مونده؟ بعضی از توسعهدهندهها گفتن موقع توسعه از down استفاده میکنن تا دیتابیس رو تا یه جایی برگردونن. نویسنده خودش ترجیح میده همیشه از یه دیتابیس تازه شروع کنه و با seeder (یعنی کلاسی که دیتابیس رو با دادهٔ مشخص پر میکنه) به وضعیت دلخواه برسه. مثلاً میشه برای هر فیچر یه seeder جدا ساخت و با دستور migrate:fresh و گزینهٔ --seeder اجراش کرد. اینجوری دیتابیس روی همهٔ سیستمهای تیم یکسان میمونه.
تیم Tempest میخواد واکنش جامعه رو ببینه و شاید در آینده down migration رو کامل حذف کنه، شایدم نگهش داره. ولی توصیهشون عوض نمیشه: گذشته رو برنگردون، رو به جلو حرکت کن.
نکات کلیدی:
- تو Tempest 2 اینترفیس DatabaseMigration حذف شده و جاش MigratesUp و MigratesDown اومدن.
- روش پیشنهادی فقط پیادهسازی MigratesUp هست، یعنی forward-only migration.
- نوع برگشتی up() و down() دیگه nullable نیست.
- ارتقا به Tempest 2 با ابزار خودکار انجام میشه.
- برای برگردوندن دیتابیس موقع توسعه، پیشنهاد نویسنده migrate:fresh همراه با seeder مخصوص هر فیچره.




