• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مکان درست تعریف method های مشترک دز mvc
#1
با نام و یاد خدا
با سلام
اگر بخواهیم یه فروشگاه اینترنتی رو در قالب mvc راه اندازی کنیم ، چند تا پرسش دارم که ممنون میشم راهنمایی کنید:
1- گرفتن قیمت یا مشخصات یک محصول از پایگاه داده بر عهده model هست. حالا اگر ما بخواهیم میزان تخفیف این محصول رو حساب کنیم این رو باید در controller حساب کنیم و یا در model .
2- در model فقط باید توابعی که با پایگاه داده سروکار دارن تعریف بشن یا میشه توابع دیگه رو هم حتی اگر به پایگاه داده نیاز نباشه (حداقل به صورت غیر مستقیم) تعریف کرد.
3- چنانچه یه تابع داشته باشیم که در 2 صفحه یا بیشتر بهش نیاز داشته باشیم، این رو باید کجا تعریف کنیم (با توجه به اصل تکرار نکردن کدها) . مثلا در دو صفحه با controller های متفاوت چگونه میشه از یه تابع استفاده کرد.
با سپاس.
  پاسخ
تشکر شده توسط :
#2
سلام

نقل قول:1- گرفتن قیمت یا مشخصات یک محصول از پایگاه داده بر عهده model هست. حالا اگر ما بخواهیم میزان تخفیف این محصول رو حساب کنیم این رو باید در controller حساب کنیم و یا در model .
یک متد داخل مدل میتونه این کارُ انجام بده.

نقل قول:2- در model فقط باید توابعی که با پایگاه داده سروکار دارن تعریف بشن یا میشه توابع دیگه رو هم حتی اگر به پایگاه داده نیاز نباشه (حداقل به صورت غیر مستقیم) تعریف کرد.
3- چنانچه یه تابع داشته باشیم که در 2 صفحه یا بیشتر بهش نیاز داشته باشیم، این رو باید کجا تعریف کنیم (با توجه به اصل تکرار نکردن کدها) . مثلا در دو صفحه با controller های متفاوت چگونه میشه از یه تابع استفاده کرد.
به طور کلی متدها رو در مدل بنویسید و داخل کنترلر صدا بزنید. این کار به شما کمک میکنه داخل یک مدل از متد های سایر مدل ها استفاده کنید.
هر چیزی که در جستن آنی آنی...
غایب
  پاسخ
تشکر شده توسط : Alaa alisafar110 ayoubsys
#3
نقل قول:1- گرفتن قیمت یا مشخصات یک محصول از پایگاه داده بر عهده model هست. حالا اگر ما بخواهیم میزان تخفیف این محصول رو حساب کنیم این رو باید در controller حساب کنیم و یا در model .

این بخش رو میتونید هم تو مدل در نظر بگیرید هم در کنترلر . ولی بهتر اینه قیمت و مشخصات رو از مدل دریافت و در کنترلر تخفیفات صورت بگیره

نقل قول:2- در model فقط باید توابعی که با پایگاه داده سروکار دارن تعریف بشن یا میشه توابع دیگه رو هم حتی اگر به پایگاه داده نیاز نباشه (حداقل به صورت غیر مستقیم) تعریف کرد.

خیر. فقط باید توابع مربوط به دیتابیس در مدل تعریف شوند

نقل قول:3- چنانچه یه تابع داشته باشیم که در 2 صفحه یا بیشتر بهش نیاز داشته باشیم، این رو باید کجا تعریف کنیم (با توجه به اصل تکرار نکردن کدها) . مثلا در دو صفحه با controller های متفاوت چگونه میشه از یه تابع استفاده کرد.

یک کنترلر بنام my_controller تعریف میکنید که از کلاس کنترلر extend میشه و تمامی متدهای مشترک کنترلر ها رو در اون مینویسید
  پاسخ
تشکر شده توسط : alisafar110
#4
@ImanAzadi
لطفا برای مواردی که عرض کردین منبع معتبر ذکر کنید تا مطالعه کنم. چون به نظرم درست نیست.

https://www.sitepoint.com/the-mvc-pattern-and-php-1

کد:
Controller
The final component of the triad is the Controller. Its job is to handle data that the user inputs or submits, and update the Model accordingly. The Controller’s life blood is the user; without user interactions, the Controller has no purpose. It is the only part of the pattern the user should be interacting with.

The Controller can be summed up simply as a collector of information, which then passes it on to the Model to be organized for storage, and does not contain any logic other than that needed to collect the input. The Controller is also only connected to a single View and to a single Model, making it a one way data flow system, with handshakes and signoffs at each point of data exchange.


کد:
The Controller can be summed up simply as a collector of information, which then passes it on to the Model to be organized for storage


و...
هر چیزی که در جستن آنی آنی...
غایب
  پاسخ
تشکر شده توسط : Alaa ayoubsys
#5
(۱۳۹۶ بهمن ۰۸, ۰۹:۳۴ ق.ظ)ImanAzadi نوشته:
نقل قول:1- گرفتن قیمت یا مشخصات یک محصول از پایگاه داده بر عهده model هست. حالا اگر ما بخواهیم میزان تخفیف این محصول رو حساب کنیم این رو باید در controller حساب کنیم و یا در model .

این بخش رو میتونید هم تو مدل در نظر بگیرید هم در کنترلر . ولی بهتر اینه قیمت و مشخصات رو از مدل دریافت و در کنترلر تخفیفات صورت بگیره

نقل قول:2- در model فقط باید توابعی که با پایگاه داده سروکار دارن تعریف بشن یا میشه توابع دیگه رو هم حتی اگر به پایگاه داده نیاز نباشه (حداقل به صورت غیر مستقیم) تعریف کرد.

خیر. فقط باید توابع مربوط به دیتابیس در مدل تعریف شوند

نقل قول:3- چنانچه یه تابع داشته باشیم که در 2 صفحه یا بیشتر بهش نیاز داشته باشیم، این رو باید کجا تعریف کنیم (با توجه به اصل تکرار نکردن کدها) . مثلا در دو صفحه با controller های متفاوت چگونه میشه از یه تابع استفاده کرد.

یک کنترلر بنام my_controller تعریف میکنید که از کلاس کنترلر extend میشه و تمامی متدهای مشترک کنترلر ها رو در اون مینویسید

با سلام به همه دوستان و سپاس صمیمانه از دوستانی که پاسخ دادند.

این 2 مثال رو اگر ممکنه بررسی و پاسخ بدید ؛ این ها برام پرسش شده چون تعبیر های متفاوتی ازشون دیدم و خوندم.:
الف )
می خواهیم به یه کاربر در بخش محیط کاربریش خلاصه وضعیت زیر رو نشون بدیم در آدرس user/dashboard.
خلاصه وضعیت های :
- فهرست محصولات مورد علاقه
- نظرات این کاربر
- صورت حساب های این کاربر
تا اینجا ما نیاز داریم که اطلاعات رو از 3 جدول products , comments, bill بخونیم و بهش نمایش بدیم.
طبیعی هست که ما در هر کدام از model های این 3 جدول متد های مورد نیازمون رو از پیش داریم.
بهترین و استانداردترین راهکار که بتونیم کارایی ، توسعه پذیری ، تکراری نبودن و ... رو تضمین کنیم چیه؟
1- اون متد های مشترک رو همگی در model پایه و پدر بنویسیم(که این جوری فکر کنم خیلی این فایل شلوغ بشه)
2- یه کلاس واسط در نظر بگیریم که از model پدر ارث ببره و اون 3 مدل از این کلاس میانی(که در این صورت نمی دونم این کلاس میانی رو باید کجا و در کدام پوشه قرار بدم)
3- طبق صحبت جناب احسان(undifined) ما وصل میشیم به مدل user و از اون متد های مدل های دیگه هم استفاده می کنیم (این رو هم نمیدونم چه جوری، که ممنون میشم یه نمونه کد بنویسید یا توضیح بدید)

ب) و بحث دیگم اینه که :
ما اعتبار سنجی داده کاربر رو که هنوز صحبت وصل شدن به پایگاه داده نیست دقیقا کجا انجام میدم؟ مثلا :
کاربری می خواد ثبت نام کنه و با درخواست user/register اطلاعاتش رو می فرسته . در تابع register که یه action هست در کنترلر user ما باید :
1- اعتبار سنجی کنیم بدون نیاز به پایگاه داده.
2- بررسی کنیم که این مثلا email از قبل در پایگاه داده ما وجود نداشته باشه.
3- ثبت اطلاعات.
لطفا بگید استانداردش چیه ؟
- این که من همه این ها رو در یک تایع انجام بدم در همون مدل user
- یا اینکه مثلا 3 تا تابع بنویسم در مدل user که این 3 کار رو انجام بده
- و یک برنامه نویس دیگه هم می گفت: اونی که به پایگاه داده مربوط نیست (در اینجا اعتبار سنجی داده از لحاظ ساختار) رو به عنوان یک method در کنترلر تعریف کنیم اما به صورت private یا protected .
- یا روش دیگری
ممنون میشم که توضیح بدید به ویژه اگر که با نمونه کد باشه
با سپاس از وقتی که میگذارید .
  پاسخ
تشکر شده توسط :
#6
نقل قول:1- اون متد های مشترک رو همگی در model پایه و پدر بنویسیم(که این جوری فکر کنم خیلی این فایل شلوغ بشه)
2- یه کلاس واسط در نظر بگیریم که از model پدر ارث ببره و اون 3 مدل از این کلاس میانی(که در این صورت نمی دونم این کلاس میانی رو باید کجا و در کدام پوشه قرار بدم)
base model و base controller نه برای نوشتن متد های مشترک(در این مثالتون) بلکه برای rewrite متد های پدر استفاده میشه. لینک نمونه

نقل قول:3- طبق صحبت جناب احسان(undifined) ما وصل میشیم به مدل user و از اون متد های مدل های دیگه هم استفاده می کنیم (این رو هم نمیدونم چه جوری، که ممنون میشم یه نمونه کد بنویسید یا توضیح بدید)
من اینطور توضیح دادم.
نقل قول:به طور کلی متدها رو در مدل بنویسید و داخل کنترلر صدا بزنید. این کار به شما کمک میکنه داخل یک مدل از متد های سایر مدل ها استفاده کنید.

مثال ساده: در مدل تخفیف یک متد داریم که مبلغ محصول رو میگیره و میزان تخفیف اون رو حساب میکنه. در کنترلر محصولات، یک محصول رو از پایگاه داده میگیریم، یک شی از مدل تخفیف ایجاد میکنیم و قیمت محصول رو بهش میدیم. خروجی مدل تخفیف میزان تخفیف محصول مورد نظر ماست. اون رو برای کاربر return میکنیم.
با این روش هر جا که نیاز باشه میتونیم از متد تخفیفمون استفاده کنیم.

نقل قول:ما اعتبار سنجی داده کاربر رو که هنوز صحبت وصل شدن به پایگاه داده نیست دقیقا کجا انجام میدم؟
در مدل مربوط بهش. چطور این کارُ انجام بدیم؟ فریم ورک های پی اچ پی مثل yii، laravel یا... رو بررسی کنید. این کار پاسخ خیلی از سوالاتتون رو هم میده.
موفق باشید.
هر چیزی که در جستن آنی آنی...
غایب
  پاسخ
تشکر شده توسط : alisafar110 ayoubsys


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان