PDA

View Full Version : رفتار مدل MVC



sam.iran67
چهارشنبه 14 تیر 1391, 17:15 عصر
سلام!
من یه پروژه php با مدل mvc دارم می نویسم .تعدادی ابهام در مورد مدل mvc دارم که اینجا مطرح می کنم.تشکر می کنم اگه عزیزان این ابهامات رو برطرف کنن.
-مفهوم کلی و نحوه انتخاب کنترلر ها چه طوری هست؟
- نحوه ورود به سایت از طریق فایل index.php چه طوری میشه؟
- اگر بخواهیم از post به جای get استفاده کنیم چه طوری کنترلر action مناسب رو انتخاب می کنه؟
- هنگامی که صفحه به مرورگر کاربر می رسه آدرس به صورت زیر هست

http://localhost/application/view/page.php

که من نمی خوام کاربر ببینه فولدری مثل view و application وجود داره و کاربر به جای آدرس فوق این آدرس رو ببینه:

http://localhost/page.php

sam.iran67
چهارشنبه 14 تیر 1391, 18:10 عصر
کسی نیست پاسخ بده!!!!

plague
چهارشنبه 14 تیر 1391, 18:51 عصر
3 تا سوال اولت رو من متوجه نمیشم چی میگید !
سوال آخرت هم اینجوری نیست
بستگی به فریم ورک داره ولی قاعدش معمولا اینه که
اول آدرسه سایته
http://localhost/
بعد اسم کنترلر مثلا
blog
بعد اسم فانکشنی که توی کنترلر قراره فراخانی بشه
posts
بعد از اون هم اگه چیزی بیاد به عنوان آرگومان اون تابع میشه
کلش اینطوری میشه
http://localhost/blog/wellcom

اصلا قرار نیست که اسم فولدر ها توی Url بیاد

sam.iran67
چهارشنبه 14 تیر 1391, 19:05 عصر
متشکرم!:تشویق:
اینو بگم من از هیچ framework ای مثل zend ,cake و غیره استفاده نکردم و از صفر و بر مبنای مدلmvc پروژه رو شروع کردم.

- نحوه انتخاب کنترلر چه طوری هست؟ برای روشن شدن موضوع مثال می زنم در صفحه ثبت نام با ادرس http://localhost/register.php هستیم و فرم ثبت نام را پر می کنیم و ارسال می کنیم حال بر چه مبنایی در طرف سرور کنترلر مناسب را انتخاب کنیم تا بتوانیم view بعدی رو انتخاب کنیم.

- در ضمن استفاده از ajax چه طور هست؟ در لایه view قرار می گیره دیگه؟

plague
چهارشنبه 14 تیر 1391, 19:37 عصر
ببینید شما نیاز به یه ساختار لینک دارید که از طریق اون بفهمید کدوم کنترلر فراخانی شده
ساختار رایج همونیه که من شرح دادم شما هم میتونید همون رو دنبال کنید که برای این نیاز به یه parser دارید که url رو بررسی کنه و قسمت های مورد نیاز رو به ما بده
بنابراین همچین آدرسی
http://localhost/register.php
توی این مدل معنی نداره
مگه اینکه با htaccess تغییرش بدین به یه آدرس مناسب مثلا
http://localhost/user/registrationform (http://localhost/register.php)
این مثلا یه آدرس مناسبه که از کنترلر user میاد تابع registrationform (http://localhost/register.php) رو فراخانی میکنه

view ها هم از توی کنترلر مشخص میشه
مثلا در تابع registrationform (http://localhost/register.php) میاد در ویو ها فرم ثبت نام رو در میاره و به مراجعه کننده نشون میده
این فرم ثبت نام پست میشه مثلا به
http://localhost/user/register (http://localhost/register.php)

که عمل ثبت نام رو انجام میده بعد ویو مناسب رو لود میکنه و نشون میده به کاربر


ایجکس هم اگه منظورت کد های جاوا اسکریپتشه بعله در ویو قرار میگیره

sam.iran67
چهارشنبه 14 تیر 1391, 20:16 عصر
از اینکه سریع پاسخ میدید متشکرم.:تشویق:
من درست متوجه شدم؟
باید یه کلاس مثلا router داشته باشیم که برای هر کاربر ایجاد شده و کلیه url request های کاربر را دریافت کرده و آنرا تحلیل کرده و یک کنترلر مناسب بر اساس تحلیل ، ایجاد می کند و آنرا Load می کند.

برای ویو ها هم باید کلاس داشته باشیم و از آن شی ایجاد کنیم یا فقط دریک فایل نوشته و آنها را در کنترلر مناسب Include کنیم.

این عبارت منظم (regular expression ) مربوط به فایل .htaccessرو چه طوری بیان کنیم؟

ببخشید سوالاتم زیاد هست.

plague
چهارشنبه 14 تیر 1391, 21:04 عصر
کلاس روتر رو درست گفتید ولی چرا برای هر کاربر کلاس جدا ؟ url ها برای همه یکی خواهد بود و شما یدونه کلاس روتر بیشتر نیاز ندارید بقیش رو درست گفتی
برای ویو ها هم معمولا کلاس ی میسازن که اسمشون رو میگیره و به ترتیب نمایششون رو میده همچنین این ویو ها مقادیری رو باید بتونن بگیرن تا توشون نمایش داده بشه معمولا این مقادیر رو به عونوان آرایه به ویو در هنگام فراخانیش میفرستن
مثلا فرض کن میخای پست یه بلاگ رو ببینی
توی کنترلر از دیتابیس متن پست و تایتلش و تاریخش خونده میشه و توی آرایه ریخته میشه
این آرایه به ویو مورد نظر فرستاده میشه تا مقادیر در جای مناسبشون قرار بگیرن و ویو نمایش داده میشه

htaccess هم مثل سایت های معمولیه فرقی نمیکنه هرچند فریم ورک ها معمولا یدونه جایگزین داخلی دارن براش
در کل نیاز به استفاده از این گزینه زیاد پیدا نمیکنید چون ساختار url ها در mvc جوریه که تقریبا شما رو ازش بی نیاز میکنه
مثلا محبوب ترین مورد استفاده از Htaccess مخفی کردن فرمت صفحات هستش که توی این ساختار نمایش url در mvc فرمت صفحات نمایش داده نمیشن
البته یه مورد هست که من فراموش کردم بهتون بگم باید اینو میگفتم که در این مدل ما یه صفحه داریم که در واقع صفحه اصلی ما هست و همه عملیات مثل عملیات تجزیه و تحلیل url توی اون انجام میگیره
و اون صفحه Index.php هستش , در واقع تمام ادرس ها با index.php شروع میشه و اونجاست که Url بررسی میشه و کنترلر ها فراخانی میشه بر اساس url و بقیه عملیات از اونجا به بعد به کنترلر سپرده میشه
ولی برای زیبایی کار همیشه این ایندکس رو با htaccess مخفی میکنن

مثلا آدرس
http://localhost/user/register (http://localhost/register.php)
در واقع
http://localhost/index.php/user/register (http://localhost/register.php)
هستش
توی اچ تی

RewriteRule ^(.*)$ index.php/$1 [L,QSA]
با این دستور کاری میکنی که هر آدرسی فراخانی شد بدور از چشم کاربر یدونه ndex.php بندازه اولش اونوقت شما میتونی index.php رو از توی همه آدرس هاتون حذف کنید تا زیبا تر بشن به جز این دیگه چندان استفاده خاصی نداره

sam.iran67
چهارشنبه 14 تیر 1391, 21:34 عصر
منظورتون اینکه چون کلاس router برای همه ی url ها استفاده میشه و بین همه ی کاربران مشترک هست پس بهتره به صورت استاتیک استفاده بشه.

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

- در مورد سایت های چند زبانه مثلا به صورت فارسی و یا به صورت انگلیسی چگونه باید در مدل mvc عمل کرد؟
باید دو محتوا ی جداگانه طراحی کرد مثلا دو فرم ثبت نام و یا نه در دیتابیس دو ترجمه ازفیلد ها قرار می گیره و در هنگام نمایش محتوا ترجمه مناسب انتخاب میشه.اینطوری بر روی دیتابیس سر بار زیادی وارد میشه؟

- برای کش کردن کوئری ها در این مدل چگونه باید عمل کرد؟مثلا یه فولد cache در نظر بگیریم و table های مثلا کشور ، زبان که زیاد تغییر نمی کنن رو در این فولدر قرار بدیم و به جای خوندن از دیتابیس از این مکان بخونیم که سرعت بالاتر بره

plague
چهارشنبه 14 تیر 1391, 21:57 عصر
منظورتون اینکه چون کلاس router برای همه ی url ها استفاده میشه و بین همه ی کاربران مشترک هست پس بهتره به صورت استاتیک استفاده بشه.
خیر شما گفتید که برای هر یوزر یه کلاس روتر بسازم من گفتم که که نه همه از یک کلاس استفاده میکنن و نمیخاد کلاس جدا بسازید برای هر یوزر


- در مورد سایت های چند زبانه مثلا به صورت فارسی و یا به صورت انگلیسی چگونه باید در مدل mvc عمل کرد؟
باید دو محتوا ی جداگانه طراحی کرد مثلا دو فرم ثبت نام و یا نه در دیتابیس دو ترجمه ازفیلد ها قرار می گیره و در هنگام نمایش محتوا ترجمه مناسب انتخاب میشه.اینطوری بر روی دیتابیس سر بار زیادی وارد میشه؟

معمولا فایل language هستش که توی اون کلمات در متغیر هایی ریخته میشن برای هر زبان یه فایل جدا بوجود میاری
در هنگام فراخانی ویو با توجه به زیان کاربر کلمات کلیدی لازم رو از فایل زبان میخونیم و با همون آرایه ای که گفتم میفرستیم به ویوی مثل متغییر معمولی که توش کلمات هستن اونها رو تو وویو نمایش میدیم در جای مناسب

برای کش کردن کوئری هم همون روش معمول

sam.iran67
چهارشنبه 14 تیر 1391, 22:20 عصر
سوال زیاد پرسیدم ببخشید:متفکر:

این فایل languge چه طور ساختاری دارد؟فعلا به عنوان اخرین خواسته اگه میشه یه مثال هم بزنید.

اگه در اینده سوالی داشتم در همین Page مطرح می کنم.باز هم تشکر می کنم

راستی چرا کلاس استاتیک نباشه ؟ مگه مشکلی داره؟

plague
پنج شنبه 15 تیر 1391, 06:51 صبح
فایل languge یچیزی میشه شبیه به


$languge['hi'] = 'سلام';
$languge['bye'] = 'خداحافظ';
و اسمشو میزارم persian.php
در واقع یه آرایست با مقادیر
ما توی کنترلر میایم فایل زبان مناسب رو لود میکنیم
بعد کلمه مورد نظرمون رو فراخانی میکنیم
مثلا تو فریم ورکی که من کار میکنم اینجوریه


$this->lang->load('persian', 'persian');
$hi = $this->lang->line('hi');
echo $hi; // سلام


اینکه مکانیزم داخلی چجوریه که اینها رو فراخانی میکنه از این بحث فراتر میره ولی به طور خلاصه اینکه کلا برای عملیات درونی فریم ورک از پترن رجیستری استفاده میشه
شما بخای ساده ترش رو پیاده کنی یدونه پروپرتی یا همون متغیر کلاس (نمیدونم شما چی خوندیش ! ) تعریف میکنی برای کلاست لودرت از نوع آرایه
وقتی فایل زبان توسط کلاس لود میشه آرایه فایل زبان در اون آرایه کلاس ریخته میشه در متد Line آرگومان متد رو به عنوان شناسه اون خونه آرایه که متن مورد نظر داخلشه رو میگیری و اون خونه رو برگشت میدی



function line($column):
{
return $this->anguage_array[$column];
}

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

sam.iran67
پنج شنبه 15 تیر 1391, 10:09 صبح
بهتر نیست از فایل xml استفاده کنیم.به عنوان مثال


<name>
<persian> نام </persian>
<Arabic> الاسم</Arabic>
</name>


اینجوری همه زبانها در یک فایل هست و باید فایل xml رو پردازش کنیم.بعد فایل language.xml رو لود می کنیم.

plague
پنج شنبه 15 تیر 1391, 10:54 صبح
این دیگه میل خودته
به نظر من اینطوری مشکل تر و احتمالا کند تره
چون باید xml رو پارس کنی اول
همچنین بستگی به حجم کار داره تو یه سایت بزرگ اگه همه کلمات توی یک صفحه باشه ممکنه بیش از حد حجیم بشه کدها

farhadfery
پنج شنبه 15 تیر 1391, 11:04 صبح
شما فعلا درگیر فایل زبان نشوید. مفهوم MVC - و مربوط به ان مثل router - config- componennt- helper- ... اینها را درک کنید و سپس به نظر من اگر علاقه دارید با CI کار کنید و با گذشت زمان یا با همین فریمورک کار می کنید یا عوضش می کنید

sam.iran67
پنج شنبه 15 تیر 1391, 11:15 صبح
تا این جا یه جمع بندی داشته باشیم که اگه کسی مثل من مشکل داشته دیگه بتونه از همین تاپیک استفاده کنه !البته اگه درست متوجه شدم.
- نقطه ورود هر کاربر صفحه index.php هست.که باید در این صفحه یه فایل Load ایجاد کنیم که کتابخانه ها و کلاس های لازم و فایل language رو لود کنه.
- در مرحله بعد از کلاس روتر که وظیفه تشخیص کنترلر مناسب رو داره(بر اساس url request کاربر) یک شی ایجاد می کنیم.

- در درون کلاس روتر بر اساس الگوی url ها یک controller مناسب new می کنیم.حال این شی controller ، خود وظیفه لود کردن view مناسب رو داره و داده های لازم که باید در این view نمایش داده بشن رو از کلاس model که یک شی از آن درون کلاس کنترلر هست بیرون میاره و به صورت یک آرایه به view می فرسته و این view به مرورگر کاربر ارسال میشه.

حالا سوالی که مطرح هست در استفاده از ajax ادرس url صفحه تغییر نمی کنه ولی درخواست به سرور ارسال میشه ، و کنترلر باید یه action انتخاب کنه ولی url تغییر نکرده؟؟

sam.iran67
پنج شنبه 15 تیر 1391, 11:22 صبح
جناب farhadfery (http://barnamenevis.org/member.php?62454-farhadfery) خوشحال می شم اگه در مورد مفهوم view, controller , model کمکم کنید فقط ارجاع به لینکهای دیگه ندید.لطفا

sam.iran67
پنج شنبه 15 تیر 1391, 15:22 عصر
اگه در مورد کلاس router کمی توضیح بدید متشکرم که چه طوری کنترلر رو انتخاب می کنه؟

farhadfery
پنج شنبه 15 تیر 1391, 22:00 عصر
سوال اول شما در مورد مفهومش و سوال دوم در مورد پیاده سازی.
برای پیاده سازی کتاب بخونید. یا اینکه یه فریمورک که همون CI را پیشنهاد می دم. بررسی کنید. (کتاب هم قبلا چندین بار معرفی کردم.)
------------
در مورد مفهوم و برای اشنایی اولیه:
http://forum.iranphp.org/ (http://forum.iranphp.org/Thread-%D9%85%D9%86%D8%B7%D9%82-MVC-%D9%88-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A2%D9%86)
2- http://forum.iranphp.org/Thread (http://forum.iranphp.org/Thread-%D9%85%D9%82%D8%A7%D9%84%D9%87-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D8%B3%D9%87-%D9%84%D8%A7%DB%8C%D9%87-MVC)