اگر بخواهیم یک لایه اضافه کنیم ارتباط لایه ها به چه صورت میشود . میشه یک مثال بزنید.
Printable View
اگر بخواهیم یک لایه اضافه کنیم ارتباط لایه ها به چه صورت میشود . میشه یک مثال بزنید.
سلام مهندس شهرکی.روش استفاده از MVC بصورت Procedural چطوریه؟
اگه امکانش هست مثال لاگینی که توی این لینک با استفاده از کلاس گفته رو بصورت Procedural توضیح بدین؟
منظور پروسیجر نویسی سمت دیتابیس رو میگید؟
منظورم اینه که در برنامه اصلا از شی گرایی(OOP) استفاده نکنم.
یعنی به صورت کلاسیک برنامه بنویسم.نه اینکه نمیخوام شی گرایی کارنکنم بعدا حتما کار می کنم.
دوستان mvc قدیم را میتوان در فریم ورکهای کیک مشاهده نمود.روش جدید را هم در فریم ورک ای
به نظر بنده mvc خیلی عالیه اما mvc که دست کاربر را محدود نکنه.به نظر بنده در ci بحث mvc خیلی خوب و انعطاف پدیر پیاده شده.
به نظر بنده ساختار برنامه نویسی خوبه که ثابت نباشه چون دیگه میشه یک ابزار نه برنامه نویسی
توی مثال اون لینک که گذاشتین که یک مشکل عمده وجود داره که توی کامنتهای همون سایت هم اشاره کردم (نوشتن کوئری توی کنترلر و ارسال به مدل برای اجرا). اما درهرحال، مثال فوق رو بدون شئ گرایی (اما به روش صحیح) بازنویسی کردم تا ببینید چطور میشه:
1- View
2- Modelکد HTML:<?php
if(isset($result) && count($result) > 0) {
// Login successful, do something here
}
else {
?>
<form action="" method="post">
<?php echo (isset($message) ? '<p>' . $message . '</p>' : ''); ?>
<table>
<tr align="left"><th>Username:</th><td><input name="username" type="text" /></td></tr>
<tr align="left"><th>Password:</th><td><input name="password" type="password" /></td></tr>
</table>
<input type="submit" value="Login" />
</form>
<?php
}
?>
3- Controllerکد HTML:<?php
function Connect() {
$con = mysql_connect('localhost', 'root', '') or die('Connection error');
mysql_select_db('myDB', $con) or die('Database error');
mysql_query('SET NAMES \'utf8\'');
mysql_set_charset('utf8');
return $con;
}
function GetRows($fields) {
$result = array();
if(!is_array($table, $fields, $count)) {
return false;
}
$count = (is_int($count) ? intval($count) : 0);
$con = Connect();
$table = Escape($table);
$where = '1=1';
foreach($fields as $fieldName => $fieldValue) {
$fieldName = Escape($fieldName);
$fieldValue = Escape($fieldValue);
$where .= " AND `{$fieldName}`='{$fieldValue}'";
}
$query = mysql_query("SELECT * FROM `{$table}` WHERE ({$where}) ORDER BY `id` LIMIT {$count}");
if($query && mysql_num_rows($query) > 0) {
while($row = mysql_fetch_assoc($query)) {
$result[] = $row;
}
}
return $result;
}
function Escape($str) {
$con = Connect();
return mysql_real_escape_string($str, $con);
}
?>
البته این فقط یک مثاله و قطعاً وقتی پروژه بزرگتر میشه، قدرت شئ گرایی هم بیشتر به چشم میاد چون مباحثی مثل توابع همنام و... مطرح میشه (وقتی همزمان به چند مدل، ویو یا کنترلر نیاز پیدا کنیم) که این مباحث توی شئ گرایی و بخصوص با کمک قابلیت namespace به راحتی قابل رفع خواهد بود.کد HTML:<?php
require_once 'model.php';
if(isset($_POST['username'], $_POST['password'])) {
$params = array(
'username' => $_POST['username'],
'password' => md5($_POST['password'])
);
$result = GetRows('users', $params, 1);
$view = 'login-form.php';
require_once $view;
}
?>
جناب شهرکی من توی MVC برای هر جدول از دیتابیس یک مدل و یک کنترل به اسم همون جدول دارم.
وقتی اینارو اینکلود میکنم به مشکل بر میخورم.به همین دلیل مجبورم اسم یکی از کلاس هارو تغییر بدم.
امکانش هست که این مشکل برطرف بشه ؟ یعنی ما بتونیم 2 تا کلاس همنام داشته باشیم و موفعه اینکلود به مشکل بر نخوریم ؟!
با namespace میشه ولی راه درستی نیست. بهتره اسامی واضح و بدون ابهام بگذارین. مثلاً users_model و...
سلام جناب شهرکی
خسته نباشید
بابت این تاپیک پر ارزش ازتون متشکرم
بنده قبلا در دوران دانشجویی پروژه پایانی ام رو بر اساس معماری سه لایه(mvc) پیاده سازی کردم ولی وقتی این تاپیک رو مطالعه کردم فهمیدم که اشتباهاتی در کارم بوده و خودم خبر نداشتم و از این بابت ازتون متشکرم
سوال برام پیش اومده،میخوام بدونم رابطه معماری سه لایه با برقراری امنیت از دید شما چطوری هست؟آیا تاثیر گذاره یا نه باید از تکنیک های دیگر استفاده کرد برای برقراری امنیت؟منظورم اینه که معماری سه لایه چقدر به امنیت وب سایت کمک میکنه؟
با تشکر
بطور مستقیم MVC و کلاً معماری چندلایه تأثیری روی امنیت نداره. منظورم اینه که به خودی خود باعث ایجاد امنیت نمیشه اما از این جهت که به شما کمک میکنه منطق برنامه رو از استخراج اطلاعات و نمایشش جدا کنید، باعث میشه که فکرتون توی کد آزادتر باشه و مباحث امنیتی رو بهتر زیرنظر داشته باشین. مثلاً توی Model تمام کارهای لازم برای امن کردن ورودیهایی که قراره توی کوئری بکار برن و توی دیتابیس ذخیره بشه و... درنظر بگیرین و توی View تمام کارهایی که برای Escapeکردن خروجی که قراره برای کلاینت ارسال بشه انجام بدین تا درمقابل حملاتی مثل JS Injection و... ایمن باشید. تمام این کارها رو هم درحالی میتونید انجام بدین که Controller که منطق پردازش ورودیهای کاربر و انتخاب عملیات مناسب براساس اونها رو داره، دیگه درگیر مباحث امنیتی مثل SQL Injection و امثالهم نمیشه.
سلام آقای شهرکی.ببخشید من اگه بخوام مثال لاگینی که در بالا زحمت کشیدین توضیح دادین رو اجرا کنم یعنی توی پوشه ی www کپی کنم چه فایلهایی رو باید کپی کنم و بعد صفحه ی index.php چی میشه و اینکه اگه بخوام پروژه خودمو با مدل mvc بدون شی گرایی بنویسم جهت توسعه پروژه تمام کدهای من باید داخل این سه فایل ذخیره بشه؟(منظورم اینه ساختارشو بلد نیستم).
مثلا باید کل کدهای طراحی (css ,javascript,jquery) باید توی قسمت view وارد بشه؟و...
باید یک فایل index بسازین با یک مدل، ویو و کنترلر اصلی که index این فایلها رو فراخوانی میکنه و کنترلر اصلی، برحسب پارامترهای ورودی کاربر، مدل، ویو و کنترلرهای دیگه رو صدا میزنه (مثلاً login). برای ساختار ذخیره سازی هم میتونید به اشکال مختلف عمل کنید. مثلاً همه مدلها توی یک پوشه، همه ویوها توی یک پوشه و همه کنترلرها توی یک پوشه جداگانه و اسم فایل هرکدوم، اسم ماژولی باشه که براش درنظر گرفتین. مثلاً:
controllers
login.php
logout.php
models
login.php
logout.php
views
login.php
logout.php
یا اینکه یک پوشه components بسازین و توی اون پوشه، برای هر بخش یک پوشه فرعی بسازین و فایلهاش رو داخلش قرار بدین:
components
login
controller.php
model.php
view.php
logout
controller.php
model.php
view.php
یا اینکه همه فایلها رو توی پوشه components بگذارین و اسم هر بخش رو پیشوند اسم فایلهاش بگذارین:
components
login_controller.php
login_model.php
login_view.php
logout_controller.php
logout_model.php
logout_view.php
بهرحال این ساختار، تا حدود زیادی دست خودتونه و مهمتر از اون، منطقی هست که روی MVC حاکمه و باید رعایت کنید.
استاد جواب ما رو نداد ی؟
اگه بخوایم به صورت اختیاری یک لایه یا چند لایه اضافه کنیم باید ارتباط لایه ها رو چه جوری ارتباط بدیم ؟
گفتم که، بستگی به طراحی خودتون داره. اینکه لایه اضافه شده برای چه کاری درنظر گرفته شده. مثلاً اگه لایه جدید، وظیفه کار با موتور قالب رو داره، باید بعد از View قرار بگیره یا اگه وظیفه خنثی کردن کدهای مخرب جهت نمایش صحیح توی خروجی رو داره، باید بین Model و View باشه. اما قبل از تمام اینها، باید دید آیا واقعاً اون لایه اضافه لازمه یا میشه توی همین لایه ها قرارش داد؟
سلام. با توجه به اینکه ارتباطی بین Controller و View وجود نداره توی یک سیستم Login ساده کاربر اطلاعات رو وارد می کنه و Controller بر حسب اطلاعات کار های مربوط به ورود مثل بررسی صحیح بودن و مقدار دهی Session رو انجام میده که حالا دو حالت وجود داره یا ورود موفقه یا ناموفق خب با توجه به چیزی که قبلا گفتم که ارتباطی بین Controller و View نیست لایه ی View باید چه جوری تشخیص بده که ورود موفق بوده یا ناموفق که اطلاعات صحیحو نمایش بده!
آیا Controller باید موفق یا ناموفق بودن رو توی Model ذخیره کنه و View با توجه به چیزی که توی Model هست اطلاعاتو نمایش بده؟!اگه اینجوری بشه ما توی لایه View باید if else داشته باشیم؟
ببینید، مسئله دقیقاً همینه که در معماری جدید MVC هیچ اشکالی نداره که View دارای دستورات شرطی و... باشه. اما به شرطی که همونطور که خودتون اشاره کردین، این شرطها صرفاً بررسی یکسری پارامتر باشه که کنترلر تنظیم میکنه و براساس اونها، خروجی View عوض میشه. البته دقت کنید که Controller لزوماً نباید داده های Model رو برای مثال لاگین تغییر بده بلکه خودش میتونه سشن بسازه و توی View وجود/عدم وجود سشن بررسی بشه. این مسئله با ارسال اطلاعات از Controller به View فرق میکنه چون سشن سراسریه و همه بهش دسترسی دارن. یه چیزی مثل متغیرهای سراسری.
با سلام و تشکر بسیار از زحمات شما یه سوال داشتم:
اینکه یک سری فانکشن ها مثل multihash قرار در چند صفحه مورد استفاده قرار بگیرن جای این فانکشن ها کجاست؟
یعنی کجا قرار ذخیره بشن؟
ممنونم.
اینها معمولاً توی یک پوشه جداگانه و تحت عنوان Library قرار میگیرن. بطور کلی به اینها نمیشه گفت یک لایه جداگانه هستن چون توی تمام لایه ها مورد استفاده قرار خواهند گرفت.
سلام آقای شهرکی.ببخشید جواب پست بالا رو که زدم ندادین.
لطف کنید و نگاهی به این فایل بندازید هیچ کدنویسی انجام ندادم و میخوام بدونم ساختاری که در mvc باید داخل پوشه ی www درست کنم اینطوریه؟
دوست عزیز، ساختار رو که گفتم دست خودتونه. مهم نحوه کدنویسیه.
سلام ببخشید آقای شهرکی لطف کنید کمی در مورد نحوه کدنویسی(کدنویسی mvc بدون شی گرایی(Procedural ) و با شی گرایی) توضیح بدین و یا سایت هایی جهت آموزش معرفی کنید.
اگه لطف کنید یه مثال عملی (کد نویسی بدون شی گرایی) بذارین ممنون میشم.
سلام دوستان
این آموزش هم عالیه: لینک دانلود
من خودم تا قبل این اصلا نمی تونستم mvc کار کنم، فقط زبان اصلیه حواستون باشه
ببخشید اگه جای بدی پست می دم، من خودم می خواستم این آموزش رو آپلود کنم ولی اینجا پیداش کردم
دوست عزیز، این شکل مربوط به معماری قدیمه. معماری جدید همونطور که توی اسلایدها اشاره شده، کلاً شکل کار رو تغییر داده. هرچند این شکل هم به نظرم اشتباه باشه چون Model فقط از کنترلر دستور میگیره (در هر دو معماری قدیم و جدید) و تفاوت معماری قدیم و جدید در اینه که در قدیم، Controller داده ها رو از Model میگرفت و تحویل View میداد ولی در معماری جدید، View خودش این اطلاعات رو دریافت میکنه و کنترلر این وسط نقشی نداره.
توی اون نمونه برنامه ای که شما نوشته بودید لایه ی View یک نمونه از شئ Controller رو در اختیار داشت. می خواستم ببینم چه نیازیه که View به Controller دسترسی داشته باشه؟
قبلاً بهش اشاره کردم. بخاطر اینکه درصورت نیاز به تغییر داده های Model، از کنترلر بخواد دستورات لازم رو به Model بده.
سلام دوستان یه نگاهی هم به این لینک ها بندازین ببین کدومش برای ساختار mvc بهتره؟
http://anantgarg.com/2009/03/13/writ...mework-part-1/
http://stackoverflow.com/questions/1...re-for-a-forum
http://www.onextrapixel.com/2012/03/...ing-structure/
سلام آقای شهرکی اگه نمونه مثال عملی (لاگین توسط Procedural mvc) از شما درخواست کردم رو نمی تونید بذارید لطف کنید سایت آموزشی معرفی کنید چون من هر چی گشتم با کلاس برنامشو نوشته بودن.شرمنده من نتونستم بنویسمش.
دوست عزیز، من که کدهای لازم رو براتون نوشتم. اگه فقط index مونده، بفرمایید تا اون رو هم بنویسم ولی کار خاصی نیست و خودتون هم میتونید بنویسید.
جناب شهرکی میشه یک نمونه که در اون دیتابیس هم به کار رفته باشه بنویسین ؟
طوری که من فهمیدم برای هر جدول از دیتابیس یک مدل داریم که در این مدل کارهای مربوط به اون جدول مثل اضافه کردن ویرایش و.... انجام میشه
درسته ؟
شرمنده آقای شهرکی من توی این پست این تیکه رو متوجه نشدم و یه سری دیگه هم از شما پرسیدم ولی جوابی بهش ندادین.
این لینکو که برای دانلود گذاشتم نگاه کنید اگه منظور شما این بود پس لطف کنید بگید، کد logout.php و login.php رو چطوری باید بنویسم؟
ضمیمه 107695
و خواهشا اگه علاوه بر index.php اگه باز لازمه کدنویسی بشه بگید که چه فایلی و چطوری؟ آقای شهرکی ممنونم میشم این برنامه رو طوری تکمیلش کنید که وقتی توی پوشه ی www ریختم اجرا بشه.
یه سوال دیگه کدهای java یا css کجا باید زده بشن؟
خدا کنه تونسته باشم منظورمو برسونم.
ظرف همین یکی دو روز براتون یک مثال کامل از login و logout با MVC بصورت Procedural آماده میکنم.
سلام آقای شهرکی لطفا در مورد پیاده سازی معاری 3 لایه (three-tier programming) در php هم توضیح و مثال می زنید.
این هم از مثال Procedural MVC که قولش رو داده بودم. دقت کنید که این فقط یک مثال خیلی کوچکه که یکی از روشهای پیاد هسازی MVC رو بصورت رویه گرا و بدون شئ گرایی نشون میده و فقط دو جزء Login و Logout رو پیاده سازی میکنه. البته توی همین مثال کوچک هم میشه فهمید شئ گرایی چقدر به ساده شدن این برنامه میتونه کمک کنه. توضیحات لازم درمورد نحوه نصب و تست پروژه توی فایل ReadMe.txt موجوده. فقط یک نکته مهم برای کارکردن این برنامه اینه که mod_rewrite توی Apache باید فعال باشه تا کار کنه. موفق باشید.
سلام آقای شهرکی این خطاها چیه میده؟
mod_rewrite توی Apache رو فعال کردم.
بعد از کلیک رو Login خطای زیرو میده؟
ضمیمه 107915
يك پوشه توي www به اسم pmvc بسازين و فايلها رو داخل اون بگذارين.
سلام،من با ساختار mvc یک قسمت کوچیک نوشتم برای نمایش عنوان و مطالب یک جدول،اگه وقت دارید یک نگاه بکنید ببینید با استاندارد جدید مطابقت دارد یا نه
سلام شرمنده آقای شهرکی یه مشکل دیگه اینکه وقتی رو لاگین (عکس error1) کلیک میکنم خطای زیرو میده و توی نوار آدرس اینو ADDR/login اضافه میکنه و کار دیگه ای انجام نمیده؟ http://localhost/pmvc/ADDR/login
Notice: Use of undefined constant ADDR - assumed 'ADDR' in C:\wamp\www\pmvc\library\view.php on line 13
Login
دوست عزیز، اگه فایلها به درستی توی پوشه pmvc قرار گرفته باشن، مشکلی پیش نمیاد چون ثابت ADDR توی فایل config.php که توی اون پوشه قرار داره، تعریف شده. دقت کنید که باید حتماً ازطریق آدرس localhost/pmvc وارد سایت بشین تا فایل config در ابتدای فایل index ضمیمه بشه و ثابتهایی که توش تعریف شده، بارگذاری بشن.
منتظر پاسخ:لبخندساده:
عالی بود اقای شهرکی ، ولی امیدوارم روی زبان فارسی مانور بدیم . چون این چیزی که طراحی شده به نظرم به زبان فارسی بر به مشکل می خوره !
علاقه مند به همکاری برای ساخت یه مدل ام وی سی در گیت هاب !
شرمنده که اینقدر چک کردن کد شما طول کشید. راستش خیلی سرم شلوغ بود. کدی که نوشتین خیلی خوب بود. فقط چند مورد اصلاحات انجام شد که بیشتر، ریزه کاری بود و اصول کلی رو رعایت کرده بودین. کد اصلاح شده رو اینجا آپلود کردم.
سلام ، من یه login ساده نوشتم میتونید بررسی کنید ، ممنون .
من مثالهای توی پاور پوینت رو انجام دادم مثال اول که یه رشته رو اکو میکنه ولی با این ارور برخورد کردم مشکل چیه
هرچی چک میکنم چیزی دستگیرم نمیشه
Notice: Trying to get property of non-object in C:\xampp\htdocs\mvcshahraki\view\view.php on line 15
دوستان نمیشه کسی جواب بده؟
یه جایی توی تنظیمات مشکل دارین. کدهاتون رو بطور کامل بگذارین یا ایمیل کنید یا اطلاعات TeamViewer رو برام پیام خصوصی کنید تا به سیستمتون وصل بشم ببینم مشکل کجاست.
سلام
mvc دقیقا یعنی چی؟
الآن من واسه پروژم کتابخونه درست می کنم و توابع رو از اون فراخوانی می کنم.
به نظرتون دارم ام وی سی تشکیل می دم؟
بدون کتابخونه هم می شه ام وی سی درست کرد
آیا بدوم دونستن oop می شه ام وی سی درست کرد.
ممنون
سلام
کتابی در این مورد سراغ دارید؟