امروزه الگوی MVC (مخفف عبارت Model View Controller) در اکثر برنامهها و نرمافزارهای تحت وب پیادهسازی میشود. اولین بار این الگو در زبان برنامهنویسی Smalltalk استفاده شد و پس از آن توسط زبان برنامهنویسی Java همهگیر شد. هماکنون فریم ورک های بسیاری با ساختار الگوی MVC ایجاد شدهاند. همانگونه که در جریان هستید فریمورکهای بسیاری بر مبنای زبان برنامهنویسی PHP وجود دارند که از این الگو پیروی میکنند. بنابراین یک واقعیت بسیار بزرگ وجود دارد و آن محبوبیت الگوی MVC در زبان برنامه نویسی PHP است. لذا برآن شدیم آموزشی به زبان فارسی در ارتباط با الگوی MVC در PHP خدمت شما دوستان عزیز ارائه دهیم.
الگوی MVC توسط سه بخش Model, View و Controller تفکیک میشود:
Model، وظیفهی مدیریت اطلاعات و دادهها را به عهده دارد. به عبارت دیگر این قسمت وظیفهی ذخیرهکردن و بازگردانی اطلاعات موجود از پایگاه داده (Database) و انجام برخی اعمال منطقی بر روی آنها را به عهده دارد.
View، وظیفهی نمایش اطلاعات تولید شده توسط Model را بر عهده داشته تا آن را در یک فرمت و شمایل خاص به کاربران نمایش دهد.
Controller، وظیفهی تنظیم و هماهنگی بین Model و View را بر عهده دارد. Controller یک درخواست از کاربر دریافت میکند سپس Model را جهت دستیابی به اطلاعات طبقهبندی شده متناسب با پردازشی که انجام داده است، فراخوانی کرده و در نهایت اطلاعات را به View ارسال میکند.
در تصویر زیر یک دیاگرام مشاهده میکنید که به صورت کامل رابطهی بین Model, View و Controller را نمایش میدهد:
در این آموزش یک مثال کاربردی تحت عنوان کتابخانهی شخصی جهت آشنایی بیشتر شما عزیزان با ساختار الگوی MVC ایجاد کردهایم:
همانگونه که در تصویر زیر مشاهده میکند فولدر نرمافزار ما تحت عنوان MVC دارای ۳ فولدر controller, model و view و یک فایل Index.php جهت هماهنگی بخشهای مختلف است.
Controller به عنوان اولین موجودیت یک نرمافزار MVC یک سری درخواست (Request) از کاربر دریافت میکند. سپس این درخواستها را به Model ارسال کرده و پاسخی که از Model دریافت کرده را به لایهی View ارسال میکند. بنابراین در پوشهی controller تنها یک فایل وجود دارد که با نام Controller.php مشخص شده است. و تمامی فرمانهای کنترلی یک وب سایت مانند ذخیره کردن، فیلتر کردن و ... در این فایل پردازش میشود. اگر نگاهی به فولدرها داشته باشید متوجه خواهید شد که فولدرهای model و view یک فریمورک کوچک با ساختاری متناسب را تشکیل دادهاند.
فایل Controller.php را باز کرده و کدهای زیر را درون آن قرار دهید:
include_once("model/Model.php"); class Controller { public $model; public function __construct() { $this->model = new Model(); } public function invoke() { if (!isset($_GET['book'])) { // درصورتیکه کتابی درخواست نشد لیست تمام کتابها را نمایش دهد $books = $this->model->getBookList(); include 'view/booklist.php'; } else { // ارسال و نمایش کتاب درخواستی $book = $this->model->getBook($_GET['book']); include 'view/viewbook.php'; } } }
کلاس Controller دارای یک تابع و سازندهی پیشفرض است. این سازنده یک کلاس Model را ایجاد کرده و برابر متغییر لوکال model$ قرار میدهد. سپس با تعریف یک تابع تحت عنوان invoke و استفاده از یک شرط چک میکند که آیا درخواستی برای نمایش کتاب وجود دارد یا خیر؟ که در صورت عدم ارسال درخواست لیستی از کتابهای موجود را از Model دریافت کرده و در View مربوط به آن (view/booklist.php) را به نمایش میگذارد. در غیر اینصورت کتاب درخواستی را به Model ارسال کرده و پاسخ آن را در خروجی View موردنظر (view/viewbook.php) نمایش میدهد.
و اما فایل index.php که تمام درخواستها را به Controller محول میکند.
بنابراین ویرایشگر خود را باز کرده و فایل index.php را با محتویات ذیل پر میکنید:
// index.php file include_once("controller/Controller.php"); $controller = new Controller(); $controller->invoke();
در خط شماره ۳ فایل index.php، فایل Controller.php از پوشهی controller با استفاده از تابع include_once فراخوانی شده است. سپس در خط ۵ یک نمونهی جدید از کلاس Controller ایجاد کرده و در نهایت متد invoke را فراخوانی کردهایم.
همانطور که قبلا ذکر شد Model وظیفهی فراهم کردن دادهها و انجام اعمال منطقی روی آنها را به عهده دارد. جهت اضافه کردن Model به ساختار نرمافزاری خود نیاز به دو کلاس داریم. ۱) Model.php و ۲) Book.php. به کلاس Model در هر بار اجرای برنامه نیازی نیست. کلاس Book به عنوان یک کلاس Entity شناخته میشود. در یک نرم افزار با الگوی MVC بهترین روش بدین صورت است که کلاسهای Entity یا کلاسهایی که هویت یک شیء را مشخص میکنند توسط Model فراخوانی شوند. بنابراین فایل Model.php را به صورت زیر ایجاد میکنیم:
include_once("model/Book.php"); class Model { public function getBookList() { // بخشی جهت شبیهسازی دادههای موجود در دیتابیس return array( "Jungle Book" => new Book("Jungle Book", "R. Kipling", "A classic book."), "Moonwalker" => new Book("Moonwalker", "J. Walker", ""), "PHP for Dummies" => new Book("PHP for Dummies", "Some Smart Guy", "") ); } public function getBook($title) { // استفاده کردن از یک تابع برای دسترسی به تمام کتاب های موجود در دیتابیس $allBooks = $this->getBookList(); return $allBooks[$title]; } }
همانطور که ملاحظه میکنید در فایل فوق ابتدا فایل Book.php را جهت ساخت نمونههای اولیه فراخوانی کردهایم. سپس یک تابع تحت عنوان getBookList ایجاد کرده تا تمامی اطلاعات را از دادههای تولیدی دریافت کند (در دنیای واقعی این اطلاعات در دیتابیس و پایگاه داده ذخیره میشوند و دیگر تابع getBookList کاربردی ندارد بلکه از یک کوئری Select استفاده میشود). در نهایت نمونههای دلخواه را متناسب با فیلدهایی که در کلاس Book وجود دارند ایجاد میکنیم. سپس تابع getBook را نوشته و عنوان تمامی کتابها را باز میگردانیم.
بنابراین در فایل Book.php کلاس Book را بدین صورت تعریف میکنیم:
class Book { public $title; public $author; public $description; public function __construct($title, $author, $description) { $this->title = $title; $this->author = $author; $this->description = $description; } }
آخرین مرحله تنظیم خروجی و قالب نمایشی اطلاعات است. این اطلاعات توسط Model به شکلهای متفاوتی مانند: Objects یا XML و Json یا ... بازگردانده خواهند شد. شاید بتوان گفت سادهترین بخش یک نرم افزار با الگوی MVC، بخش View آن است. این بخش از کدهای HTML و المانهای JavaScript تشکیل میشود. در واقع Controller اطلاعات را از طریق Model به یک View خاص ارسال میکند. معمولا برای هر فایل یک View مجزا ایجاد میکنیم. در این مثال فولدر view دو فایل viewbook.php و booklist.php دارد.
فایل viewbook.php را ایجاد کرده و محتویات کد زیر را درون آن قرار میدهیم:
<html> <head></head> <body> <?php echo 'Title:' . $book->title . '<br/>'; echo 'Author:' . $book->author . '<br/>'; echo 'Description:' . $book->description . '<br/>'; ?> </body> </html>
و در نهایت برای فایل booklist.php داریم:
<html> <head></head> <body> <table> <tbody><tr><td>Title</td><td>Author</td><td>Description</td></tr></tbody> <?php foreach ($books as $title => $book) { echo '<tr><td><a href="index.php?book='.$book->title.'">'.$book->title.'</a></td><td>'.$book->author.'</td><td>'.$book->description.'</td></tr>'; } ?> </table> </body> </html>
در دو فایل فوق با استفاده از دستورهای مشخص مانند book->author$ به اطلاعات موجود در Model دست پیدا کردیم و آنها را در خروجی هر فایل نمایش دادیم.
به شما تبریک میگوییم. یک مثال کاملا کاربردی با استفاده از الگوی MVC در زبان برنامهنویسی PHP بوجود آوردید. اما این مقاله را بدون شرح مهم ترین نکات الگوی MVC ترک نمیکنیم. بنابراین نکات زیر برای هر زبانی که از ساختار MVC پیروی میکند بسیار حائز اهمیت است و میتواند به درک شما از این الگو و معماری ۳ لایه کمک کند:
توجه: دوستان عزیز آموزش ویدیویی پی اچ پی (PHP) از مقدماتی تا پیشرفته به زبان فارسی + ساخت CMS مشابه وردپرس را میتوانید با کلیک روی اینجا یاد بگیرید. (این دوره در حال برگزاری است)
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.