PDA

View Full Version : نحوه پیاده سازی سایت ها با مدل mvc



sam.iran67
یک شنبه 18 تیر 1391, 21:52 عصر
سلام!:گیج:
من یه پروژه با مدل mvc دارم پیاده سازی می کنم.یه خورده در مفهوم مدل mvc مشکل دارم از دوستانی که می تونن واقعا کمک کنن درخواست کمک دارم.سوالاتی که دارم رو در همین page قرار می دم.با تشکر

- نحوه تعریف subdomain در مدل mvc چه طوری تعریف میشه؟
- مدیریت سایت های چند زبانه ای در مدل mvc چه طوری هست؟
- نحوه تحلیل و تجزیه url در مدل mvc چه طوری هست؟


لطفا به جای ارائه لینک ارجاع پاسخ بدید؟؟؟؟

mtchabok
دوشنبه 19 تیر 1391, 07:00 صبح
سلام
در ابتدا میشه بگید که آیا از فریم ورک خاصی دارین استفاده میکنین یا نه ؟

sam.iran67
دوشنبه 19 تیر 1391, 12:11 عصر
سلام جناب mtchabok (http://barnamenevis.org/member.php?170796-mtchabok) :تشویق:
از اینکه به این تاپیک توجه کردید متشکرم!
از هیچ فریم ورکی استفاده نکردم و دقیقا دارم از صفر پروژه رو می نویسم.ممنون می شم که تو ی همین page از کمک ها و راهنمایی ها تون استفاده کنم.

sam.iran67
دوشنبه 19 تیر 1391, 15:48 عصر
سلام
لطفا کمک کنید !به سوالاتی که در مورد پیاده سازی بر اساس مدل mvc دارم

mtchabok
دوشنبه 19 تیر 1391, 21:51 عصر
سلام

نحوه تحلیل و تجزیه url در مدل mvc چه طوری هست؟
برای تحلیل آدرس می تونید از تجزیه متداول استفاده کنین :

localhost/controller/action/param1/param2/...

localhost/index.php/controller/action/param1/param2/...

localhost/index.php?controller=value&action=value&param1=value&param2=value


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


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

sub.localhost/action/param1/param2/...
localhost/subdomainController/action/param1/param2/...
اگر کاربر آدرس اول رو وارد کنه در واقع آدرس دوم رو صدا زده و این قابلیت رو باید در تشخیص مسیر قرار بدید تا مسیر های خاص رو تعریف کنین .

sam.iran67
دوشنبه 19 تیر 1391, 23:39 عصر
از اینکه پاسخ دادید متشکرم.
:گیج:
نحوه نوشتن یک کنترلر و روتر مناسب چه طوری هست؟یعنی چه function هایی باید داشته باشه؟
چه طوری باید url ها تجزیه بشن و چه طوری کنترلر و action مناسب فراخوانی بشن؟
- چه طوری داده های انتخاب شده از مدل توسط کنترلر به view مناسب فراخوانی می شن؟
- نحوه استفاده از ajax در این مدل چه طوری هست؟چون که آدرس صفحه تغییر نمی کنه یعنی کنترلر و اکشن در url صفحه ثابت هست و لی درخواست جدید به سرور ارسال شده است؟

راستش من کمی با مدل و مفهوم mvc آشنا هستم و بیشتر مشکلاتم در پیاده سازی هست. اگه مثال های ملموس بزنید بهتر است.
---------------
فکر کنم که این تاپیک یک مرجع مناسب برای دیگر کاربران در پیاده سازی مفهوم مدل mvc بشه البته به لطف شما.

mtchabok
سه شنبه 20 تیر 1391, 11:28 صبح
نحوه استفاده از ajax در این مدل چه طوری هست؟چون که آدرس صفحه تغییر نمی کنه یعنی کنترلر و اکشن در url صفحه ثابت هست و لی درخواست جدید به سرور ارسال شده است؟
در ابتدا باید بگم که همه تکنیکهای برنامه نویسی در زبان php می بایست به طور کامل سمت سرور باشن و نباید نمایی در سمت کلاینت داشته باشن . منظورم این هست که نباید فکر کنین که این مدل قراره که براتون همه کار بکنه . در واقع این شما هستید که باید با استفاده از این مدل سایت خودتون رو راه اندازی کنین . بنابراین نحوه ارتباطات آژاکس و یا ارسال پارامترها از سمت کلاینت به سرور می بایست در کنترلرها قرار گیرد تا بشه به صورت سفارشی در هر کنترلر مقادیر و پارامترها و پردازش داده ها رو تغییر داد . ( مگر برای پروژه ای خاص شود که خود فریمورک رو به ارتباطات آژاکس حساس کرد )

localhost/controller/action/param1/...
localhost/blog/ajax/?setRate=3&post=12
من در مثال بالا ارتباط آژاکس کنترلر blog رو به صورت دستی در اکشن ajax قرار دادم و پارامترها رو براش ارسال کردم . پس برای ارتباطات آژاکس می بایست در کنترلری که به آژاکس نیاز داره خودتون روشی رو ابداع کنین .


چه طوری باید url ها تجزیه بشن و چه طوری کنترلر و action مناسب فراخوانی بشن؟
آدرسها رو می بایست بر اساس / از هم جدا کرده و به ترتیب از ابتدا که کنترلر ، دوم اکشن و سوم به بعد نیز به عنوان پارامتر برای اکشن ارسال بشن .
البته روش دیگه ای برای آدرس نویسی پارامتر وجود داره که به صورت زیر هست :

localhost/controller/action/paramName1/paramValue1/paramName2/paramValue2/...
نحوه فراخوانی کنترلر و اکشن نیز می بایست به صورت زیر باشه :

localhost/controller/action/param1/...

controllersDirectory/controller.php

class controller{
function action( $param1 ){
// codes
}
}
کافیه که فایل کنترلر رو لود کنین و در کلاسی که در فایل بود به دنبال اکشن بگردید و پارامترها رو براش ارسال کنین . نام فایل کنترلر و نام کلاس کنترلر می بایست به هم شبیه باشن و یا باید توسط الگوریتمی خاص بدست بیان .


نحوه نوشتن یک کنترلر و روتر مناسب چه طوری هست؟یعنی چه function هایی باید داشته باشه؟
در کنترلر می بایست سعی شود تا به تمامی قسمتهای فریمورک دسترسی یابد ، بعنوان مثال میشه به شئی درخواست ، پاسخ ، برنامه ، مدل و ... اشاره کرد .
روتر باید توانایی پردازش آدرس و بازسازی آدرس رو داشته باشه بنابراین روتر می بایست از الگوریتم مناسبی استفاده کنه ، در ابتدا میتونید از الگوریتم ساده ترتیب کنترلر، اکشن ، پارامتر استفاده کنین و در بعدا میتونین روی آدرسهای سفارشی کار کنین تا به صورت سفارش شده روتر بتونه آدرس رو پردازش و بازسازی کنه .


چه طوری داده های انتخاب شده از مدل توسط کنترلر به view مناسب فراخوانی می شن؟
این کار تماما به عهده کنترلر هس و کنترلر میتونه با ارتباطی که با شئی view داره متغیری رو ایجاد کنه و اطلاعات مدل پردازش شده رو در متغیر قرار داده و view نیز از همون متغیر استفاده کنه . در واقع شئی view موجود در کنترلر هست که view مربوط به کنترلر رو اجرا میکنه . استفاده از مدل تماما به صورت دستی در کنترلر تعریف میشه و هیچگاه به صورت اتوماتیک نیس و می تونید در کنترلی مدل داشته باشید و یا نه در ضمن نام متغیر هم میتونه هرچیزی باشه فقط باید قوانین تعریف نام متغیر در کلاس رو رعایت کنین .

sam.iran67
سه شنبه 20 تیر 1391, 14:13 عصر
سلام ! :تشویق:
برای ویو باید کلاس داشته باشیم یا فقط آدرس فایل رو در کلاس کنترلر داشته باشیم و هر جا که لازم بود include کنیم.

چه طوری متغیر ها رو به view ارسال کنیم یعنی متغیر $heade چه طوری توسط کنترلر با داده جایگزین میشود.؟؟

View:


<h1><?php echo $header?></h1>

mtchabok
سه شنبه 20 تیر 1391, 16:23 عصر
بهتر هست که برای view کلاسی طراحی بشه تا متدهای لازم هم برای view درش قرار بگیره و البته با طراحی کلاس ، میشه متغیر رو به صورت پروپرتی به شئی داد که اینکار توسط کنترلر انجام میشه .
همونطوریکه قبلا گفتم در کنترلر باید شئی view وجود داشته باشه تا خود کنترلر بتونه متغیر رو ثبت و ویرایش کنه .
برای لود فایل view هم از خود شئی ویو استفاده میشه .
مثال :

<?php
class examController extends controller{
public function indexAction($param=null){
$this->view->examModel = 12;
}
}

class view{
public function render(){
// render code
}
}

class controller{
protected $view;

function __construct(){
$this->view = new view();
}



function render(){
$this->view->render();
}
}

یه کنترلر با اسم exam دارم که از کلاس controller مشتق شده و حالا اگر اکشن index این کنترلر صدا زده بشه یه متغیر در شئی ویو با اسم examModel ایجاد میکنه و میتونید در فایل ویو که کار نمایش رو بعهده داره از این متغیر به صورت زیر استفاده کرد .

<h1><?php echo $this->examModel; ?></h1>
البته حتما لازم هست که این فایل ویو در شئی ویو لود بشه .

sam.iran67
چهارشنبه 21 تیر 1391, 08:45 صبح
سلام!:بوس:
من یه پروژه کوچولو با مدل mvc نوشتم و تست کردم که یه مشکل نسبتا ساده داره ولی من علتش رو نمی دونم.
وقتی آدرس زیر رو لود می کنم فایل css لود نمی شه و صفحه بدون css بارگزاری میشه



https://localhost/socialnetowrk/signup/


اما وقتی آدرس زیر رو در مرورگر می زنم مشکلی نداره



https://localhost/socialnetowrk/signup


تنها تفاوت هم یک / هست؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟!!!!!!!!!!!!!!

mtchabok
چهارشنبه 21 تیر 1391, 10:29 صبح
سلام
میبایست آدرس یه چنین فایلهایی رو به صورت دستی وارد کنید . البته میتونید کلاسی درست کنید که مخصوص یه چنین فایلهایی که روی هاستتون هست در نظر گرفته بشه .
این مشکلتون به این دلیل است که آدرس فایل css تون به صورت نسبی وارد کردین و همین / باعث اشکال میشه .

localhost/blog/index.html
localhost/style.css

exam 1: ./style.css
exam 2: /style.css
در مثال بالا من یه فایل html دارم که صداش میکنم و در داخل فایل html فایل css ای که آدرسش و قرار دادم رو نیاز داره ولی دو روش آدرس من وارد کردم که
exam 1: در واقع این نوع آدرس اصلا خوب نیس به این دلیل که فقط در مسیر فایل فعلی به دنبال فایل style.css میگرده .
exam 2: همیشه سعی کنید که از این نوع آدرس دهی استفاده کنین چونکه هیچوقت امکان خطا وجود نداره .

sam.iran67
چهارشنبه 21 تیر 1391, 16:47 عصر
سلام
این کار رو کردم ولی مشکلم حل نشد!اون روشی که گفتید در هر دوصورت جواب میده یا نه؟ یعنی هم با / و هم بدون اون.

sam.iran67
چهارشنبه 21 تیر 1391, 16:53 عصر
راستی میشه یه مثال ملموس از router بزنید که بشه subAddress رو هم ساپورت کنه.اون مثالتون از کلاس کنترلر و ویو واقعا عالی بود و تونستم بر مبنای اون خیلی بهتر جلو برم جاداره دوباره تشکر کنم.

در ضمن توی این مدل MVC کش کردن داده ها و اطلاعات و صفحات چه طوری هست؟

با تشکر از صبر شما و معذرت از سوالات زیاد من

sam.iran67
پنج شنبه 22 تیر 1391, 19:25 عصر
سلام
مشکل من با / هنوز که هنوزه حل نشده راهکار دیگه ای نمیشه پیاده کرد.

mtchabok
جمعه 23 تیر 1391, 10:17 صبح
سلام
ببخشید دیر جواب میدم ...
فک کنم که برای روتر لینکهای زیر بهتر از توضیحات من بتونه کمکتون بکنه .
http://framework.zend.com/manual/1.11/en/zend.controller.router.html
http://book.cakephp.org/2.0/en/development/routing.html#Router

sam.iran67
جمعه 23 تیر 1391, 19:00 عصر
باز هم تشکر از صبر شما.
پروژه رو شروع کردم بر مبنای همون راهنمایی های خوب شما.یه فایل کانفیگ در نظر گرفتم که موارد لازم رو از طریق فایل index لود کنه.می خواستم نظر شما رو بدونم که داخل این فایل کلاس بهتره تعریف بشه که اگه اینطور هست استاتیک باشه یا نه بشه شی ساخت. ویا بهتر یه آرایه تعریف بشه که ثابتها ، مسیرها و... تعریف بشن و یا اصلا بهتر است چند تا define نوشت .

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

mtchabok
چهارشنبه 28 تیر 1391, 10:59 صبح
سلام
ببخشید اینقدر دیر دارم جواب میدم...
معمولا فایل کانفیگ به صورت ini در نظر گرفته میشه ولی میتونید قابلیتی رو در خوندن کانفیگ ایجاد کنید که هر مدلی رو بخونه .
بهترین گزینه برای استفاده از کانفیگ بر میگرده به نحوه امنیت فایلتون اگه فایل کانفیگ در پوشه public سایتتون هست و قابل دانلود هست بهتره که به صورت فایل php و کلاس باشه ولی اگه خارج از محدوده دسترسی کاربران هس میتونید از فایل ini استفاده کنین .
برای define هم میتونید از مقادیری که به صورت عمومی و مهم هستند استفاده کنین و سعی کنین زیاده روی هم نکنین . به طور مثال میتونید آدرس فعلی اسکریپت و یا در برخی فریم ورکها نحوه اجرای فریم ورک و هر موردی که به دسترسی عمومی نیاز ، از define استفاده کنید .

در فایل کانفیگ سعی کنین تا میشه تمامی تنظیمات کلی سایت رو قرار بدین البته تا اونجایی که سرعت اجرای سایتتون رو بالا ببره . چونکه فایل سریعتر از sql هس ( البته تا جایی که نیاز به پردازش خاصی نباشه ) .

sam.iran67
پنج شنبه 29 تیر 1391, 14:25 عصر
سلام.
با تشکر از پاسخ ها تون.چند تا ابهام دیگه به وجود اومده که مطرح می کنم.
- در ویو ها فایل css بهتره داخلی باشه یا خارجی؟

- فایل htaccess رو چه طور ویرایش کنم که امنیت سایت بالا بره و در ضمن فقط یک نقطه ورود index.php وجود داشته باشه و کاربر قادر به دیدن سایر منابع نباشه

- می خوام که کاربر نتونه هیچ فایلی با پسوند مثل css,php,js,html رو فراخوانی کنه و همه چیز توسط خود کنترلر ها مدیریت بشه؟

- اگه از عبارت منظم برای تحلیل آدرس url استفاده کنم چه طوره؟ این عبارت منظم چه طور باید باشه؟

Mahmoudzadeh.A
جمعه 30 تیر 1391, 11:47 صبح
سلام.
[QUOTE]- در ویو ها فایل css بهتره داخلی باشه یا خارجی؟این می تونه دست خودتون باشه که چه طور استفاده کنید ولی اگر به صورت external باشه اولا از نظر امنیت بهتر هست و می تونید حتی از نشان دادنش به کاربر جلوگیری کنید.ثانیا می تونید در چندین page استفاده کنید که باعث صرفه جویی در کد میشه و ثالثا ویرایش او راحتر هست فرض کنید که برای تک تک دکمه ها یک css یکسان ولی غیر مشترک داشته باشید اینجوری اگه بخواهید مثلا رنگ رو عوض کنید مجبورید که تک تک اون ها رو ویرایش کنید ولی اگه فایل خارجی باشه و یک کلاس استفاده کرده باشید کار کاملا راحت هست.


فایل htaccess رو چه طور ویرایش کنم که امنیت سایت بالا بره و در ضمن فقط یک نقطه ورود index.php وجود داشته باشه و کاربر قادر به دیدن سایر منابع نباشهOptions +FollowSymLinks


RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d

IndexIgnore */*
RewriteBase /

AddDefaultCharset utf-8
DirectoryIndex index.php



می خوام که کاربر نتونه هیچ فایلی با پسوند مثل css,php,js,html رو فراخوانی کنه و همه چیز توسط خود کنترلر ها مدیریت بشه؟



rewritecond %{REQUEST_FILENAME} !^(.+).css$
rewritecond %{REQUEST_FILENAME} !^(.+).js$
rewritecond %{REQUEST_FILENAME} !index.php$
RewriteRule ^(.+)$ error404.php [nc

sam.iran67
سه شنبه 03 مرداد 1391, 11:29 صبح
سلام من یه پروژه کوچولو با مدل MVC پیاده سازی کردم یه مشکل دارم اگه پاسخ بدید متشکرم!

هر وقت آدرس http://localhost/mysite/Home رو فراخوانی می کنم هیچ مشکلی ندارم ولی هر وقت آدرس


http://localhost/mysite/Home/

یعنی تنها تفاوت این دو / آخر کلمه Home هست که باعث میشه در حالت دوم اصلا Css لود نشه.

فایل htaccess هم به صورت زیر هست:


Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ index.php%{REQUEST_URI} [NC,QSA,L]

IndexIgnore *

AddDefaultCharset utf-8

Mahmoudzadeh.A
سه شنبه 03 مرداد 1391, 12:35 عصر
سلام.
آدرس دهی رو به صورت full به کار ببرید حتما درست میشه.
مثال:

<link rel="stylesheet" type="text/css" href="http://localhost/Mysite/Public/Css/style.css"/>