PDA

View Full Version : وصل کردن Model به View در معماری MVC



Nariman619
شنبه 03 آبان 1393, 19:20 عصر
سلام.
دوستان من دارم یه فریم ورک شخصی طبق معماری MVC واسه خودم درست میکنم.تا اینجا تونسم کنترلر ها و اکشن ها رو پیاده سازی کنم.اما مشکل من اینه , وقتی که دیتا رو با Model می گیرم نمی دونم چطور به View بفرستم.یعنی تو این مرحله چی کنم ؟ میتونم تو خود کنترلر دیتا رو بگیرم اما میخوام واسه View بفرستم.می خوام که یکی یه توضیح کاملی بهم بده.خودم سرچ کردم به Backbone و AngularJS رسیدم...نمی دونم چطوری اینارو به پروژه خودم ربط بدم.ممنون

Mohammadsgh
شنبه 03 آبان 1393, 21:10 عصر
مدل مستقیم به ویو داده نمیفرسته,بلکه توسط کنترلر اینکار انجام میشه.یعنی برای نمونه مدل داده ها رو از دیتابیس فراخوانی میکنه و به کنترلر میده و کنترلر هم به ویو میفرسته برای چاپ.برای پیوند بین مدل و کنترلر هم روش های زیادی وجود داره که من از روش فریم ورک یی استفاده میکنم.اگه خواستید کدتون رو بزارید تا بگم چجوری باید اینکار رو انجام بدید:لبخندساده:

Nariman619
شنبه 03 آبان 1393, 21:45 عصر
ممنون.توضیح بدین خیلی بهتره.می خوام خودم پیاده سازیش کنم هر طور شده...

H:Shojaei
شنبه 03 آبان 1393, 23:07 عصر
مدل مستقیم به ویو داده نمیفرسته,بلکه توسط کنترلر اینکار انجام میشه.
در اصل این معماری به این صورته که میتونیم از مدل به ویو داده ارسال کنیم در حقیقت بیس کار بر همین اساسه:
http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
http://www.tonymarston.net/php-mysql/model-view-controller.html
ولی بعضی جاها این مطلبی که شما ذکر کردین رو هم گفتن که فکر نکنم درست باشه:
http://www.onextrapixel.com/2012/03/14/a-detailed-overview-of-the-model-view-controller-mvc-coding-structure/

میشه ارسال به View از طریق کنترلر انجام بشه ولی دیگه فکر نکنم بشه گفت MVC چون این معماری در اصل میگه اطلاعات از مدل به ویو میرن ...
اگرم واسه فیلتر داده ها و این کاراست (که کاربرد بیش از این هم فکر نمیکنم داشته باشه کنترلر این وسط) واسه نمایش میشه همین کارا رو تو مدل انجام داد...

Mohammadsgh
شنبه 03 آبان 1393, 23:42 عصر
دوست گرامی اگه داده ها مستقیم به ویو بره عملا کنترلر اینجا نقشی نداره.در روش mvc کنونی مدل با کنترلر پیوند دارن.اگه به فریم ورک ها نگاه کنید این مفهوم رو درک میکنید

Mohammadsgh
شنبه 03 آبان 1393, 23:55 عصر
ممنون.توضیح بدین خیلی بهتره.می خوام خودم پیاده سازیش کنم هر طور شده...
پیشنهاد میکنم یک نمونه خیلی ساده از فریم ورک رو ببینید و روش کار کنید سپس خودتون بسازید چون اینجوری نمیدونید چیکار کنید.این فریم ورک کوچیک رو ببینید و اگه متوجه نشدید بگید تا واستون توضیح بدم تا درک بهتری پیدا کنید:لبخندساده:

H:Shojaei
یک شنبه 04 آبان 1393, 20:27 عصر
دوست گرامی اگه داده ها مستقیم به ویو بره عملا کنترلر اینجا نقشی نداره.در روش mvc کنونی مدل با کنترلر پیوند دارن.اگه به فریم ورک ها نگاه کنید این مفهوم رو درک میکنید
کنترلر نیازی نیست نقش داشته باشه یه فیلتر نمایش اطلاعات هست که اونم یه تابع این وسط میشه اعمالش کرد...
بله اتفاقا به فریمورک ها نگاه کردم هردوی این کارها رو میشه کرد هم میشه اطلاعات از ویو بره به کنترلر بعد به ویو و هم میشه مستقیم از مدل بره به ویو ازین لحاظ لااقل تو CI که من میدونم هیچ چیزی اثبات نمیشه...

Mohammadsgh
یک شنبه 04 آبان 1393, 21:32 عصر
پست درست نگاه نکردید,تو فریم ورک ci شما مدل رو تو یه آرایه بهه نام data میریزید و سپس تو ویو با نام آرایه data میتونید بهش دسترسی پیدا کنید
در ضمن کنترلر از نامش مشخصه,یعنی کنترل کننده که پروژه رو کنترل میکنه

arash691
یک شنبه 04 آبان 1393, 21:51 عصر
الان اگه تو view از کدهای php نظیر شرط برای بررسی session یا متغیر ها استفاده کنیم غلطه ؟ مثلا" کاربر لاگین کرده و مقادیر رو از db گرفتیم و دادیم به session حالا کجا باید session چک بشه که مقدار گرفته یا نه بعدش برای کاربر نمایش داده بشه ( منظورم نام کاربری ، ایمیل و عکس کاربر و ... ) که تو پنلش نمایش داده میشه معمولا" ...

یه چیزی رو رفع ابهام کنیم دوستان تو معماری جدید MVC گفته شده controller با view ارتباط نداره منظور اینه که داده مستقیم از model به view نره و ابتدا بیاد به controller بعد بره تو view ؟

مثلا" کدهای مربوط به کنترلر :


<?php
class CommentController extends Controller {
public function actionIndex() {
$comments = Comment::findAll();
$this->render('index', array('comments'=>$comments));
}
public function actionView($args) {
$comment = Comment::findByPk($args['id']);
if(empty($comment)) {
throw new Exception('Invalid ID');
}
$this->render('view', array('comment'=>$comment));
}
}

کدهای مربوط به view :


<table border="1px" style="width: 100%;">
<tr><th>ID</th><th>Post ID</th><th>Parent ID</th><th>Name</th><th>Email</th><th>URL</th><th>Body</th><th>Data and Time</th><th>Confirmed</th></tr>
<?php
echo '<tr>';
echo '<td>' . $comment->id . '</td>';
echo '<td>' . $comment->post_id . '</td>';
echo '<td>' . $comment->parent_id . '</td>';
echo '<td>' . $comment->name . '</td>';
echo '<td>' . $comment->email . '</td>';
echo '<td>' . $comment->url . '</td>';
echo '<td>' . $comment->body . '</td>';
echo '<td>' . date('Y/m/d H:i:s', $comment->ts) . '</td>';
echo '<td>' . ($comment->confirmed ? 'Yes' : 'No') . '</td>';
echo '</tr>' . PHP_EOL;
?>
</table>

Mohammadsgh
یک شنبه 04 آبان 1393, 22:24 عصر
روشی که استفاده میکنید همینه و درسته.برای تعریف و ایجاد سیشن هم تو مدل انجام بدید.این کلاس دیتابیس active record هم ترکونده ها:لبخند:

arash691
یک شنبه 04 آبان 1393, 22:33 عصر
میشه یه مثال بزنید برای سشن ؟ چرا باید مقدار دادن سشن رو ببریم طرف مدل ؟ :متفکر:

Mohammadsgh
یک شنبه 04 آبان 1393, 23:43 عصر
ببخشید اگه کدا نا مرتبه مرورگرم مشکل دارهpublic function login() { Session::init(); Session::set('role', $get[0]['role']); Session::set('loggedIn', true); Session::set('userid', $get[0]['id']); header('location: ' . URL . 'dashboard/username/' . $username);{