زمانی که شما قصد داشته باشید اطلاعاتی را از پایگاه داده دریافت یا رکورد جدیدی را درج نماییم باید از model استفاده کنیم.پس سایت بدون model یک سایت استاتیک است و نمیتواند با پایگاه داده ارتباط برقرار کند.
نکته: در صورتی که در بخشی از view قرار است اطلاعاتی از پایگاه داده دریافت کنید، باید قبل از نمایش view اطلاعات مورد نیاز از طریق model دریافت شده و سپس view نمایش داده شود.
هیچ ارتباطی بین model و view بصورت مستقیم وجود ندارد و تنها راه ارتباط آنها با هم از طریق controller ها ی مربوطه است.
نحوه اجرای یک model از طریق controller
برای مثال اگر کاربر وارد صفحه ای به نشانی “http://localhost/mvc/admin” شود در این صفحه ممکن است قصد داشته باشیم فرمی را نمایش دهیم که پس از ارسال داده هایش آنالیز و در پایگاه داده ثبت شود یا قرار است اطلاعاتی را از پایگاه داده دریافت کرده و در view نمایش دهیم.فرض کنید قرار است اطلاعاتی از پایگاه داده دریافت کرده و در view مربوط به admin نمایش دهیم.
برای اینکار model وارد عمل می شود و با پایگاه داده ارتباط برقرار کرده و نتیجه از طریق controller در view نمایش داده می شود.
نحوه ساخت model جدید
در جلسات قبل همانطور که توضیح دادیم در پوشه App فایلی به نام Controllers داشتیم که تمامی کنترلرها از روی آن ارث بری می کردند. برای ساخت model جدید می توانیم از این فایل استفاده کرد و تابع فراخوانی مدل ها را درون این فایل ایجاد کنیم.
محتوای فایل Controllers درون پوشه App
همانطور که توضیح دادیم درون این فایل دستوراتی را قرار دادیم که درون کنترلرهای نرم افزار مورد استفاده قرار می گیرد.نمونه این دستور تابع 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"; } } } ?> |
هر controller برحسب نیاز دارای یک model و یک فایل view بصورت جداگانه است.
در پوشه Models فایل جدیدی برای مدل AdminModel به نام AdminModel.php می سازیم.این فایل حاوی کلاس مربوط به مدل AdminModel است.
دستورات مربوط به فایل AdminModel.php در پوشه Models
این فایل دارای دستورات و متدهای خاص برای ارتباط با پایگاه داده در ارتباط با کنترلر Admin است.برای شروع یک کلاس به نام AdminModel ایجاد می کنیم.
مثال:
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 class AdminModel{ public function __construct(){ } protected function connect(){ $db = new PDO("mysql:host=localhost;dbname=dejavan;charset=utf8",'root',''); return $db; } protected function disConnect($con){ unset($con); return true; } public function insertUser($info){ $db = $this->connect(); $query = "INSERT INTO `tbl_users` (`UserID`, `Fname`, `Lname`, `Email`, `Username`, `Password`, `Status`) VALUES (NULL, '".$info['Fname']."', '".$info['Lname']."', '".$info['Email']."', '".$info['Username']."', '".$info['Password']."', '0')"; if($db->query($query)){ return true; }else{ $this->disConnect($db); return false; }; } } ?> |
نحوه فراخوانی مدل درون کنترلر خاص
برای اینکه بتوانیم مدل و متد مربوط به آن را درون کنترلر فراخوانی کنیم باید دستور مربوط به فراخوانی مدل را درون کنترلر مربوطه اجرا نماییم.برای مثال ما در کنترلر Admin در متد index دستور فراخوانی مدل AdminModel را وارد می نماییم.
1 |
require_once "Models/AdminModel.php"; |
سپس باید یک شی از روی کلاس مدل خود ایجاد نمائیم. آبجکت ساخته شده از روی کلاس مدل را به یک خصوصیت به نام model در کنترلر Admin تخصیص می دهیم.
مثال:
1 2 |
require_once "Models/AdminModel.php"; $this->model = new AdminModel(); |
حال اگر دستور this$ را var_dump بگیریم آبجکت AdminModel مربوط به model درون کلاس Admin مربوط به کنترلر قرار دارد.
1 2 |
var_dump($this); //object(Admin)#2 (1) { ["model"]=> object(AdminModel)#3 (0) { } } |
نمونه کنترلر Admin که در متد index مدل AdminModel فراخوانی شده است.
مثال:
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(){ //echo "construct admin"; } 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(){ require_once "Models/AdminModel.php"; $this->showView("Admin/index"); } } ?> |
حال می توانیم به متدهای درون model اشاره کنیم.در اینجا به متد insertUser برای درج کاربر جدید در پایگاه داده اشاره می کنیم.
مثال:
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 29 30 31 32 33 34 |
<?php require_once "App/Controllers.php"; class Admin extends Controllers{ public function __construct(){ //echo "construct admin"; } 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(){ require_once "Models/AdminModel.php"; $this->model = new AdminModel(); var_dump($this); $this->showView("Admin/index"); } } ?> /* object(Admin)#2 (1) { ["model"]=> object(AdminModel)#3 (0) { } } admin page */ |
با اجرای این متد از طریق model می توانیم داده جدیدی را در پایگاه داده ثبت نماییم.پس دیدیم که میتوان در جایی که در کنترلر نیاز به ارتباط با پایگاه داده هستیم به چه شکل عمل کنیم.
این روش یک مشکل دارد و آن این است که ما در هر جای کنترلر برای دسترسی به model مربوطه باید دستور فراخوانی مدل را فراخوانی کنیم.برای حل این مشکل باید آن را در جایی قرار دهیم که در تمام کنترلرها به ارث برده شود.
کلاسی که در همه کلاس ها به ارث برده می شود فایل Controllers در پوشه App است.این فایل را باز می کنیم.در این کلاس تنها یک تابع وجود داشت که وظیفه فراخوانی view را برعهده داشت.در این فایل دستور فراخوانی model را ایجاد می کنیم.
تابعی به نام showModel ایجاد می کنیم و نوع آن را public قرار می دهیم.این تابع دارای یک آرگومان است.آرگومان وظیفه دریافت نام مدل را دارد.
در این تابع وجود مدل درخواست شده را بررسی کرده ایم.در صورت وجود مدل، فراخوانی می شود.آبجکت ساخته شده را به یک خصوصیت تخصیص و آن را درون تابع برگشت می دهیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
مثال فایل Controllers: <?php class Controllers{ public function __construct(){ } public function showView($name = ''){ if(file_exists("Views/".$name.".php")){ require_once "Views/".$name.".php"; }return false; } public function showModel($name=''){ if(file_exists("Models/".$name.".php")){ require_once "Models/".$name.".php"; return $this->model = new $name(); }else return false; } } ?> |
حال دوباره به کنترلر Admin می رویم و در متد index دستور فراخوانی showModel را وارد می کنیم.
مثال:
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 29 30 31 32 33 34 35 36 |
<?php require_once "App/Controllers.php"; class Admin extends Controllers{ public function __construct(){ //echo "construct admin"; } 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(){ $model = $this->showModel('AdminModel'); $info = [ 'Fname' => 'amir', 'Lname' => 'javanmir', 'Email' => 'amir.javanmir1993@gmail.com', 'Username' => 'amir.javanmir', 'Password' => '123456789' ]; $this->model->insertUser($info); $this->showView("Admin/index"); } } ?> |
با رفتن به آدرس “http://localhost/mvc/admin” رکورد جدیدی در جدول “tbl_users” درج می شود.
فراخوانی سریع Model مربوط به کنترلر با استفاده از تابع سازنده
با توجه به اینکه در صورت فراخوانی کنترلر از طریق آدرس بار مرورگر، تابع سازنده آن اجرا می شود.جهت فراخوانی سریع و راحت به کلاس Model، متد showModel را درون تابع سازنده فراخوانی کرده و از متدهای آن در داخل متدهای مربوط به کلاس مربوط به کنترلر استفاده می کنیم.
نمونه فایل کنترلر Admin.php که متد showModel درون تابع سازنده آن فراخوانی شده و درون متد index متد insertUser فراخوانی شده است.
مثال:
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 29 30 31 32 33 34 35 |
<?php require_once "App/Controllers.php"; class Admin extends Controllers{ public function __construct(){ $this->showModel("AdminModel"); } 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(){ $info = [ 'Fname' => 'amir', 'Lname' => 'javanmir', 'Email' => 'amir.javanmir1993@gmail.com', 'Username' => 'amir.javanmir', 'Password' => '123456789' ]; $this->model->insertUser($info); $this->showView("Admin/index"); } } ?> |
حال اگر به آدرس “http://localhost/mvc/admin” بروید بخاطر فراخوانی شدن تابع index کنترلر admin متد insertUser بهمراه مقدار یک آرایه فراخوانی شده و یک رکورد جدید در پایگاه داده ثبت می شود.
با این روش توانستیم کنترلر، مدل و view خود را براساس آدرس درخواستی مدیریت کنیم.فایل نهایی mvc مربوط به دوره آموزش MVC در php برای دانلود قرار داده شده است.