PDA

View Full Version : استفاده از کلاسهای validation در mvc



IMANAZADI
شنبه 08 اسفند 1394, 06:04 صبح
با سلام
دوستان بازم سوال در خصوص mvc
فرض کنید ما یک کلاس نوشتیم برای upload و یک کلاس برای validation یا همون اعتبار سنجی فرمها مون


حالا سوال اینجاست این کلاسها رو کجا میتونیم استفاده کنم منظورم اینه تو کدوم لایه باید استفاده کنم و چطوری


فرض کنید این کنترلر صفحه home باشه


class HomeController extends controller



و
فرض کنید این مدل صفحه home باشه




class homeModel extends model





حالا اگر بخواهیم صفحه home رو اعتبار سنجی کنیم چطوری باید از کلاس validation استفاده کنیم
تو کدوم قسمت و به چه صورت (چون صفحه home یکبار extend شده ، و نمیتوانیم یک صفحه رو از دو کلاس extend کنیم !؟؟)

IMANAZADI
یک شنبه 09 اسفند 1394, 06:03 صبح
دوستان عزیز منتظر راهنمایی شما هستم

hamedarian2009
یک شنبه 09 اسفند 1394, 06:14 صبح
چون بخش آپلود فایل با منابع دخیره سازی (هارددیسک) ارتباط داره تو مدل زش استفاده کنید اما برای اعتبارسنجی فرقی نداره تو مدل استفاده بشه یا کنترلرها فقط شما تو کدنویسی باید این اصل رو رعایت کنید که هر کد رو فقط یکبار بنویسید مثلا اگه قراره اعتبارسنجی رو تو چندتا اکشن و کنترلر دیگه هم مثل همون انجام بدین کافیه تو مدل اعتبارسنجی رو تعریف کنید و تو همه اون اکشن ها ازش استفاده کنید
بخش دوم سوالتون رو متوجه نشدم چرا باید ارث بری کنید شما یکبار فریمورکهای معروف رو مشاهده کنید چیکار میکنن شما هم متوجه میشید
البته برای اینکه گفتین نمیشه بیش از یک کلاس رو ارث بری کرد راه هست مثلا از trait استفاده کنید اما اینجا لزومی نداره

IMANAZADI
یک شنبه 09 اسفند 1394, 07:41 صبح
با تشکر
منظور قسمت دوم سوالم اینه فرض کنید ما میخواهیم کلاس validate رو تو کنترلر صفحه home انجام بدیم



class HomeController extends controller


چون این صفحه از کنترلر اصلی ارث بری کرده ما دیگه نمیتونیم از extends استفاده کنیم
تنها راهی که باقی میمونه اینه که فایل کلاس رو اینکلود کنیم و ازش نمونه سازی و در صفحه جاری استفاده کنیم
آیا اصولی هست ، یا روش دیگه ایی هم هست

hamedarian2009
دوشنبه 10 اسفند 1394, 04:19 صبح
راهش همون include کردنه البته وقتی شما یه autoloader برای فریمورکتون بنویسید نیاز نیست include کنید و هربار یک کلاس رو new کنید خودش فایلش رو اینکلود میکنه

plague
دوشنبه 10 اسفند 1394, 08:44 صبح
معمولا اینها رو بخاطر کاربردی بودن به صورت helper یا third party libraries میسازن تا در هر کنترلری بشه اونها رو لود و استفاده کرد
مکان استفاده هم معمولا کنترلر ها هستن

IMANAZADI
سه شنبه 11 اسفند 1394, 07:34 صبح
معمولا اینها رو بخاطر کاربردی بودن به صورت helper یا third party libraries میسازن تا در هر کنترلری بشه اونها رو لود و استفاده کرد
مکان استفاده هم معمولا کنترلر ها هستن



دوست گرامی میشه لطفا بیشتر توضیح بدید
یا یک مثال کوچولو بزنید

ممنون میشم

plague
چهارشنبه 12 اسفند 1394, 09:05 صبح
کدوم قسمتش گنگه و نیاز به مثال دارید ؟

ببینید کنترلر رو شما معمولا نمیتونی در یک کنترلر دیگه لود و از کد هاش استفاده کنی و همچنین نمیتونی ارث بری از چند تا فایل داشته باشی

یه سری عملکرد ها هستن که مختص به یک کنترلر خاص نیستن و ممکنه نیاز باشه چندین جا ازش استفاده بشه مثل آپلود یا فرم ولیدیشن
برای حل این مشکل و نیاز نبودن به نوشتن کد تکراری 2 راه هست :

معمولا فریم ورک ها چیزی به اسم helper دارن که در واقع یه سری توابع معمولی هستن توی یه فایل
این توابع مزیتی که دارن اینه که در همه کنترلر ها/ویو ها / مدل ها قابلیت فراخوانی/استفاده دارن

third party libraries هم تقریبا مثل مثال بالا هستن یا این تفاوت که کلاس هستن که شما میتونی تو کنترلر لود و استفاده کنی


معمولا در مورد کد هایی که شما مثال زدین :
کد هایی که پیچیدگی زیادی ندارن و ساده تر هستن رو توی هلپر به صورت تابع مینویسن
کد های یکه ساختار پیچیده تری دارن رو به صورت کتابخانه مینویسن

IMANAZADI
پنج شنبه 13 اسفند 1394, 05:48 صبح
من از فریم ورک خاصی استفاده نمیکنم
و خودم یک فریم ورک ایجاد کردم و اونو گسترش میدم

من اومدم همچین کلاسی نوشتم و اونو تو صفحه اول فراخونی کردم




class Loader
{
public function __construct()
{
spl_autoload_register(array($this, 'autoload'));//spl_autoload_register(array(class, method));
}

static function autoload($class)
{
$file = LIB_DIR . DS . strtolower($class) . '.php';

if(file_exists($file))
{
include_once $file ;
}
else
{
exit("Unable to load Class {$class} .");
}
}
}



که میاد یه کلاس رو تو پوشه library سرچ میکنه و در وصورت وجود اونو اینکلود میکنه و در غیر اینصورت پیام چاپ میکنه

منظور شما هم چنین چیزی هست دیگه ؟؟؟

فقط کلاسهایی که میخواهیم استفاده کنیم متدهای اون باید static باشه تا شناسایی بشن دلیل اینم فکر کنم به spl_autoload_register برمیگرده

plague
پنج شنبه 13 اسفند 1394, 10:46 صبح
بله تقریبا همچین چیزی
درسته که شما فریم ورک خودتون رو مینویسین ولی حتما دارید از فریم ورک خاصی الهام میگیرید یا احداقل کد هاش رو نگاه میکنید
پیشنهاد میکنم لودر یه فریم ورک ساده مثل CODEIGNITER رو نگاه کنید تا با طرز کارش آشنا بشید .... من فریم ورک ننوشتم ولی تقریبا هرچی کتابخونه طرف سوم استفاده کردم و نوشتم خودم متد هاش استاتیک نبوده