[rtl]سلام. سوالی که از دیروز دهنم رو مشغول کرده اینه که فرض میکنیم یه دیتابیس داریم که توش شماره تلفن ها رو به همراه کانتکت کامل ذخیره میکنیم. حالا بعدا یادمون می افته که ما آدرس لحاظ نکردیم برای ذخیره و تو دیتابیس هم معرفی نکردید. حالا که از ابزار GII استفاده کردیم و همه چی ساختیم درست کار میکنه ؛ بخواییم بعد این که این فیلد رو اضافه کردیم چطوری میتونیم تو برنامه بگونجونیمش. اینکه میدونم میتونیم تو فرم یه فیلد دیگه تعریف میکنیم. تو مدل چیکار کنیم؟ آیا اگه دوباره از GII استفاده کنیم اون مواردی که نوشتیم از بین میره و باید ازاول شروع کنیم به کد زدن؟[/rtl]
ببینید اگه میخواین با مشکل اضافه کردن فیلد به مدلهاتون راحت تر روبه رو بشید یه راه حل وجود داره اونم اینه :
داخل پوشه مدل ها یک پوشه جدید بسازید با نام
base
فرض کنید یه جدول داریم به نام
tbl_post
که می خوایم از روش مدل بسازیم، مدل رو که ساختید یه کپی ازش بگیرید و تغییر نام بدهید(هم اسم فایل و هم اسم کلاس داخل فایل) و با نام
PostBase
در داخل پوشه بیس قرار دهید .حالا فایل اصلی پست را باز کرده و به جای اینکه آن را از اکتیورکورد اکتند کنید آن را از
PostBase
اکستند نمایید و تمام توابع بجز تابع مدل را پاک کنید .کلاس شما همچین شکلی پیدا می کند
[left]
class Post extends PostBase
{
/**
* Returns the static model of the specified AR class.
* @return Product the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
}
[/left]
از این به بعد شما به
PostBase
کاری نخواهید داشت و تمام توابع خود را در مدل پست بنویسید و اگر نیاز داشتید می توانید توابع موجود در بیس را در این مدل با همان نام ها باز نویسی کنید
با این کار شما هر زمان به جدول هایتان چیزی اضافه کنید دیگر نیازی نیست نگران تداخلش با کدهای قبلی باشید خیلی راحت آن مدل را با
gii
تولید کنید و فایل تولید شده را پس از تغییر نام به جای فایلی که در پوشه بیس قرار دارد بگذارید .
فقط یادتان باشد که در بخش کانفیگ فایل
main.php
در بخش
import
جایی که مدل ها را صدا می زنیم مدل های داخل پوشه بیس را هم صدا بزنید مانند :
[rtl]اگه نشه به راحتی دیتابیس رو رو تغییرات انجام داد واقعا دردسریه برای خوش. تو حالت کلاسیک خودش زهرمار میکنه ساعات آدمو چه برسه به اینکه رو فریم ورک انجام بدی. ولی راه حل اصلا خوبی نبود این مورد. و همیچ وقت هم نمیشه دیتابیس رو واقعا بدون اشکال ساخت اگر هم باشه بعدها تو توسعه به مشکل بر میخوریم[/rtl]
اینطوری دیگه با هر تغییر در دیتابیس نیاز به تغییر در کل کلاسها نیست. کلاس های ساخته شده با gii که جای دیگه هستند و شما روی کلاسهایی تغییرات را اعمال می کنید که خودتان ایجاد کرده اید.
من از این روش تو سیستم های خودم استفاده می کنم و واقعا جواب میده .
در مورد اینکه فایل ها زیاد میشن باید بگم ایرادی نداره و من الان تو یکی از ماژول هام حدود ۶۰ تا مدل دارم که با این روش دارم باهاشون کار می کنم . البته این روش بسته به نوع سیستم شما خیلی مزایای دیگه هم در اختیارتون میگذاره که توضیحش بسیار مفصله و باید یه بار سر فرصت براتون بنویسم
مدیریتشون هم سخت نیست ، چون عملا شما به فایل های بیس کاری ندارید و فقط روی یک فایل کد میزنید
تغییرات اگه افزایشی باشه روی مدل این سیستم تقریبا بدون مشکل خواهد بود اما اگه کاهشی و یا تغییر نام باشد در هر صورت شما باید تو کل سیستم ، نه تنها مدل تغییرات رو اعمال کنید
[font="Tahoma"] [rtl]روش جناب mereeelin روش خوبیه من با این روش برخورد داشتم.
اما راه دیگه اینکه شما اصلاً توابع اصلیتون رو توی مدل ننویسید (راستش اصلاً جاشم اونجا نیست! این فریم ورک رفیق نابابه!!!)
مدل رو همینطوری خام میزارید بمونه، حالا با همین GII شما با هر بار تغییر بازنویسیش کنید.
بعد یه شاخه مثلاً به اسم services در protected بسازید و همه کلاسهای منطق برنامتون رو اونجا بزارید. مثلاً به ازای هر مدل یه service درست کنید و توابعی که قبلاً توی مدل مینوشتید رو توی کلاس هم نام مدلتون بنویسید. لزومی هم نداره کلاسهای service از جایی اکستند بشن. یعنی اینطوری:
[rtl][font="Tahoma"]Service جاییه که منطق برنامه درش اتفاق میافته. یک سری کلاس و متد هستند که در هر کجای برنامه قابل دسترس هستند.
عمده استفاده اونها در لایه Controller هست.
اینکار باعث جداسازی منطق برنامه از Platform و مدلهای شما میشه، یعنی مثلاً اگر فردا خواستید برای پلت فرم دیگری مثلاً برای موبایل کد بنویسید ساده تر اینکارو انجام بدید.
فکر میکنم مشکل همین بود که وقتی با GII مدل جدید ایجاد میکنیم فایل Model بازنویسی میشه و توابعی که توی اون بود از بین میرن که بنده هم عرض کردم اون توابع رو میتونید از توی مدل در بیارید و توی کلاسهای دیگری تحت نام سرویس قرار بدید.
درمورد سوال آخر هم که خب فیلدهاتون تغییر کرده پس با GII مدل جدید رو تولید و روی قبلی overwrite میکنید. مشکل این کجاس؟
[rtl][font="Tahoma"]با توجه به اینکه در این روش، مدل اصلیتون تغییری نمیکنه، میتونید توسط GII مدل جدید رو تولید و روی قبلی overwrite کنید و یا دستی اون رو ویرایش کنید. فرقی نداره.