حالا چرا لاراول؟ ـ یک شاهد دیتابیسی

مایگریشن و سیدر، اولین ویژگی‌های لاراول هستند که در این مجموعه از نوشته‌ها به آن‌ها خواهم پرداخت.

لاراول، دنیایی است با ابزارهایی رنگ و وارنگ و اسم‌های جذاب، که اغلب از قبل وجود داشته‌اند و حیاتشان را مدیون لاراول نیستند، اما زیبایی در کنار هم بودنشان را چرا.

در نوشته‌ی قبل، که مقدمه‌ای بود بر نوشته‌هایی از این دست، کمی از زیبایی ظاهری لاراول گفتم و عرض کردم که ادامه خواهم داد.

در این نوشته، شاهدی در بخش تولید دیتابیس یک پروژه را نشان می‌دهم.

مایگرشن: کوچی بلندپروازانه به همین نزدیکی‌ها

یک درد مشترک...

کدهای برنامه‌ی خود را روی یکی از سیستم‌های کنترل ورژن مثل گیت نگه می‌داریم و خوشحالیم که اگر اتفاق ناگواری افتاد، به عقب بازمی‌گردیم و دقیقاً می‌دانیم هر تغییر چه تأثیری بر مخلوق ما داشته، اما دیتابیس ما از این قافله جداست.

هشدار جدی: اگر از هیچ سیستم ورژن کنترلی برای کارتان استفاده نمی‌کنید، از یکی از سیستم‌های ورژن کنترل برای کارتان استفاده کنید.

داستان از این قرار است که ما باید دیتابیس خودمان را در یک برنامه و ابزار جداگانه بسازیم و مدیریت کنیم، و هر بار که می‌خواهیم فایل‌های پروژه را به کسی بدهیم، باید یک بکاپ دستی هم از دیتابیس بگیریم و برایش بفرستیم.

بهتر نبود تهیه‌ی زیرساخت‌های اطلاعاتی را هم می‌توانستیم در ویرایشگر کد خود انجام دهیم و طراحی دیتابیس هم مثل بقیه چیزها، همان جا باشد تا هم انتقالش به دیگران راحت باشد و هم تحت نظارت گیت عمل کند؟

... یک راه حل لاراولی دارد

مایگرشن لاراول برای همین روزهاست.

الگوی دیتابیس خود را در جایی معرفی می‌کنیم، ایندکس‌ها و ارتباطات آن را با زبانی شبیه زبان آدمیزاد مشخص می‌کنیم، و فایل را که یک کلاس معمولی پی اچ پی است، لابه‌لای دیگر فایل‌های پروژه قرار می‌دهیم تا هم گیت کار خود را انجام دهد و هم ما بتوانیم با یک کپی ساده، کل پروژه را در اختیار دوست و همکار یا مشتریمان قرار دهیم.

نگران خط‌های اخطار زیر عبارت nullable نباشید. ویرایشگر من آن متدها را تشخیص نداده، ولی جایشان امن است.
نگران خط‌های اخطار زیر عبارت nullable نباشید. ویرایشگر من آن متدها را تشخیص نداده، ولی جایشان امن است.

بدبختی: «حالا فایل‌ها را ساختیم. از کجا کسی را پیدا کنیم که حوصله کند و برود و این فایل‌ها را پیدا کند و یکی یکی اجرا کند تا جداول اطلاعاتی ساخته شوند؟»

پاسخ: کنسول آرتیزان

php artisan migrate

همین!

لاراول جدولی با عنوان migration درست می‌کند و نام و نشان هر جدولی که به این روش ساخته را در آن اضافه می‌کند و یک شماره‌ی پشته به آن می‌دهد.

ما نیازی نیست کاری به کارش داشته باشیم. ولی خودش می‌داند که چه می‌کند.

مثلا اگر بخواهیم کل جدول‌ها را پاک کنیم و از نو بسازیم، چنین دستوری به کنسول آرتیزان می‌دهیم:

php artisan migrate:refresh 

و یا اگر بخواهیم فقط یکی از پشته‌ها را به عقب بازگردانیم و بی‌خیالش شویم، از این دستور آرتیزان استفاده می‌کنیم:

php artisan migrate:rollback

دحتما می‌گویید بدبختی که یکی دو تا نیست. خود آن فایل را کجا بسازیم که آرتیزان محترم پیدایش کند؟

php artisan make:migration create_users_table --create=users

لاراول برای همه‌ی آنچه که «بدبختی لاراولی» می‌خوانندش، راه حلی لاراولی دارد.

دستور بالا، همان طور که از وجناتش پیداست، یک فایل با عنوان create_users_table می‌سازد و کلاسی را در آن قرار می‌دهد و از کلاس والد اکستند می‌کند و حتی به خاطر وجود سوییچ انتهای خط، نام جدول ما را هم در آن می‌گذارد و فقط قرار است فیلدهایمان را داخلش بنویسیم و تمام!

سیدر: بذرپاشی هوشمندانه داده‌ها

یک بدبختی جدید لاراولی...

حالا با جدول‌های خالی حاصل از این کوچ بلندپروازانه‌ی مسخره چه کنیم؟ پروژه را به دوستمان یا به مشتری بدهیم و بگوییم برای این که محصول کار کند باید بروی و دستی این تنظیمات را داخل جدول‌هایش بگذاری و حداقل یک کاربر ادمین تعریف کنی که بتواند لاگین کند و یادت نرود که رمز کاربر ادمین را باید خودت یک جوری هش کنی و در دیتابیس بریزی؟

از همان اول یک بکاپ از دیتابیس می‌گرفتیم و به او می‌دادیم راحت‌تر نبود؟

... یک راه حل لاراولی دارد

همان طور که عرض کردم، لاراول برای همه‌ی آنچه که «بدبختی لاراولی» می‌خوانندش، راه حلی لاراولی دارد.

ابزاری به نام سیدر، مال همین روزهاست.

دستور تزریق داده‌هایی که زیربنای محصول ما هستند و بدون آن‌ها کاری جلو نمی‌رود (مثل تنظیمات، یا حداقل یک حساب کاربری)، و همین طور داده‌های تصادفی برای وقتی که فقط می‌خواهیم یک نسخه‌ی آزمایشی به کسی نشان دهیم، همه در فایل‌های سیدر قرار می گیرند.

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

بدبختی‌ها را دریابیم...

«این فایل‌های سیدر را از کجا بیابیم و یکی یکی اجرا کنیم؟»

پاسخ: شما نگران این چیزها نباشید. کنسول آرتیزان زحمتش را می‌کشد:

<
php artisan db:seed

«سخت نیست؟ یک بار مایگریت کنیم و یک بار سید کنیم؟»

پاسخ: شما که قبلاً ده برابر این کار را خودتان تنهایی انجام می‌دادید و مشکلی هم نبود. اما اگر گیر قضیه این جاست، بفرمایید. کنسول آرتیزان زحمت هر دو را با هم می‌کشد که دو بار دستور ننویسید:

php artisan migrate --seed

«لابد می‌خواهی بگویی که خود آرتیزان می‌آید و فایلش را هم برای ما می‌سازد؟»

پاسخ:

php artisan make:seeder SettingsTableSeeder

دوباره تکرار می‌کنم.

نسخه‌های لاراولی، تنها راه حل برای دست‌یابی به کد زیبا و محصولی قابل توسعه نیستند. بسیاری از پدیده‌هایی که در لاراول از آن‌ها سخن می‌گوییم نیز محصول لاراول نیستند و قبلاً وجود داشته‌اند.

زیبایی این فریمورک در آن است که آنچه خوبان همه دارند، او یکجا دارد.

در پایان...

این نوشته‌ها قرار نیست مطالبی آموزشی باشند و یک عالمه نکات معرکه‌ی بی عیب و نقص به کسی یاد بدهند. نوشتن درباره‌ی کم و کاست‌های کار خود، و سوتی‌هایی که داده‌ام را نیز به‌زودی آغاز می‌کنم.

یادتان نرود که نگارنده، یک مبتدی جاودانه است.

اگر به ادامه‌ی این نوشته‌ها علاقه‌مندید و عضو ویرگول نیستید که مستقیم پی‌گیر شوید، از فید آراس‌اس استفاده کنید یا در توییتر بنده را فالو بفرمایید.

اگر دستی بر قلم دارید، با همین هشتگ «چرا لاراول» در همین سایت معظم ویرگول، نیز می‌توانید شروع به نوشتن درباره‌ی خوبی‌ها و بدی‌های این فریمورک کنید تا همه استفاده نماییم.

و اما یک چیز باورنکردنی:

این پایین، یک جعبه هست که در آن می‌توانید چیزهایی بنویسید و خوشحالم کنید. مثلا بنویسید که جای چه چیزی در این نوشته خالی بود، کجایش ایراد داشت، شما به جای این کارها چه کارهای بهتری را پیشنهاد می‌کنید، و هزار و یک چیز دیگر.

اگر از این نوشته خوشتان نیامده و یا از من بدتان می‌آید و تمایلی ندارید که به روش بالا خوشحالم کنید، باز هم جعبه‌ی زیر پاسخ‌گوی نیاز شماست. این فرصت را از دست ندهید و قول می‌دهم که حتماً ناراحت شوم.