در جلسه قبل توانستیم درخواست های ارسالی از طریق آدرس بار مرورگر دریافت و کنترل کنیم. وظیفه این کنترل کردن را به فایل index.php و کلاس App سپردیم.
این کنترلر براساس درخواست هایی که دریافت می کند می تواند تصمیم بگیرد که باید با بخش Models که همان پایگاه داده است یا با بخش Views درارتباط باشد.
در این قسمت تصمیم داریم به شما نحوه ارتباط گیری کنترلها با Views را توضیح دهیم.
ایجاد فولدرهای مورد نیاز در پوشه Views
برای شروع درون پوشه Views پوشه های مربوطه که باید با کنترلرها در ارتباط باشند را ایجاد می کنیم. برای هریک از کنتلرها می بایست یک پوشه مجزا در پوشه Views ایجاد کنیم.
پوشه ها قابل ساخت به شرح زیر است:
- پوشه index:مربوط به صفحه اصلی پنل ما در خروجی
- پوشه admin: مربوط به بخش admin
- و…
تصویر
درون پوشه های ساخته شده، فایل جدیدی به هر نامی برای مثال index.php ایجاد می کنیم.وظیفه فایل index.php نمایش اطلاعات کنترلر مربوطه در خروجی است.
برای مثال فرض کنید کاربر وارد آدرسی شبیه به “localhost/mvc/admin” شده است.در این حالت کنترلر مربوط به admin از پوشه Controllers فراخوانی شده و آن اطلاعات قابل نمایش را به پوشه admin مربوط به Views ارسال می کند و فایل index.php برای مثال فرم ورود به سیستم را نمایش می دهد.
حال فایل index.php را باز می کنیم و دستورات ابتدایی html را قرار می دهیم. هدف ما نمایش این خروجی در آدرس “localhost/mvc/admin” است.
مسیر فایل جهت ویرایش:
1 |
Views/Admin/index.php |
مثال:
1 2 3 4 5 6 7 8 9 |
<!DOCTYPE html> <html> <head> <title>admin template</title> </head> <body> <p>admin template for view designer by dejavan</p> </body> </html> |
حال چطور باید view مربوط به کنترلر خود را فراخوانی کنیم؟
دقت کنید که فایل های سیستم ما با هم در ارتباط هستند و یکدیگر را براساس درخواست هایی که کاربر از طریق آدرس بار ارسال می کند فراخوانی می کنند.
برای مثال در ابتدا فایل index.php اصلی نرم افزار ما که در روت اصلی است فراخوانی می شود. این فایل دارای کلاس App است.
برای تفکیک کردن و منظم کردن کدها، کد کلاس App را برداشته، یک پوشه جدید به نام App در روت اصلی برنامه در کنار Controllers,Models و Views ایجاد می کنیم.
سپس درون پوشه App یک فایل با نام App.php ایجاد می کنیم.درون این فایل دستورات کپی شده را paste می کنیم.پس ما توانستیم فایل index.php روت اصلی خود را خالی و خلوت کنیم.
فایل ها و پوشه های روت اصلی پس از ساخت:
- App
- Controllers
- Models
- Views
- .htaccess
- index.php
تصویر ساختار پوشه ها
فراخوانی فایل App.php در هنگام اجرا شدن برنامه
حال باید فایل App.php را در فایل index.php فراخوانی کنیم و از روی کلاس App آبجکت جدید ایجاد می کنیم.
فایل index.php
کد:
1 2 3 4 |
<?php require_once "App/App.php"; new App(); ?> |
ایجاد یک کنترلر کلی برای مدیریت تمامی بخش های دارای کنترلر
برای ایجاد مفهوم ارث بری و اینکه بتوانیم برخی از متدهای کلی که در تمامی کنترلرها ممکن است مورد استفاده قرار بگیرد را در یکجا داشته باشیم، یک فایل به نام Controllers درون پوشه App ایجاد می نمائیم.
برای مثال یکی از همین مواردی که در جلسات قبل کار کردیم، حالتی بود که ما دستور اتصال به پایگاه داده را درون یک فایل سراسری قرار دادیم و هر جا در کلاس دیگر نیاز به اتصال به پایگاه داده بود از روی کلاس parent که دارای متد اتصال بود ارث بری می کردیم.
نحوه ایجاد کنترلر سراسری
برای شروع و ساخت یک کنترلر سراسری درون پوشه App فایل جدیدی به نام Controllers ایجاد می کنیم.
مثال:
1 2 3 4 5 |
<?php class Controllers{ } ?> |
حال در فایل Controllers تابع مربوط به فراخوانی view ها را ایجاد می کنیم. نام تابع را showView قرار می دهیم که این تابع دارای یک پارامتر ورودی می باشد.
این پارامتر در هنگام فراخوانی، نوع view درخواستی را دریافت می کند.
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php class Controllers{ public function __construct(){ } public function showView($name){ if(file_exists("Views/".$name.".php")){ require_once "Views/".$name.".php"; } } } ?> |
برای ارث بری از کلاس Controllers درون کلاس های خود باید از دستور extends استفاده کنیم.
اما قبل از ارث بری باید فایل Controllers را در ابتدای فایل کلاس خود فراخوانی کنیم.
مثال کلاس Admin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php require_once "App/Controllers.php"; class admin extends Controllers{ public function __construct(){ } public function newPost($name = ""){ return "the title of post is $name"; } public function sum(...$param){ if(!empty($param)){ $num = 0; foreach ($param as $item){ $num += $item; } return $num; } return false; } public function index(){ $this->showView("Admin/index"); } } ?> |
در کلاس Admin همانطور که گفتیم متدی را بعنوان پیش فرض با نام index ایجاد کرده ایم که موقعی که کاربر تنها کنترلر را از طریق مرورگر درخواست می دهد، در صورت وجود متد index فراخوانی شود.
دراین متد برای فراخوانی view مربوطه از تابع showView استفاده کرده و مقدار Admin/index به این تابع ارسال شده است.با این روش توانسته ایم view خود را از طریق آدرس دهی در متد showView فراخوانی کنیم.
برای امتحان می توانید به آدرس “http://localhost/mvc/admin” بروید این آدرس view را اجرا و مقدار admin page را نمایش می دهد.
مرور: ما توانستیم با استفاده از کنترلر و متدی به نام showView که در پوشه App وجود دارد با استفاده از درخواست هایی که در مرورگر ارسال می شود view موردنظر را نمایش دهیم.