11-28-2013, 05:23 PM
در این قسمت از سری مقالات MVC در PHP به لایه Model میپردازیم.همینطور که در قسمت اول اشاره شد لایه Model وظیفه ارتباط با پایگاه داده رو داره. در معماری MVC و کلا سیستم هایی که به صورت شیء گرا نوشته میشن معمولا برای هر کدوم از جدولهای دیتابیس یک کلاس جدا باید داشته باشیم.
این به این خاطره که کار نگهداری و گسترش در آینده به راحتی انجام بشه .حالا ما هم در این فریم ورک از این روش استفاده میکنیم.
لایه Model ( در فریم ورک ما ) برای ارتباط با دیتابیس باید قابلیت های زیر رو داشته باشه :
ارتباط با پایگاه داده
انجام عملیات اضافه / حذف و ویرایش روی جداول
اجرای کوئری های کاربر
برای داشتن یک فریم ورک خوب و کاربردی باید یک سری پیش نیازها رو قبل از پیاده سازی لایه Model انجام بدیم.پس قبل از پیاده سازی لایه مدل ما به کلاس های زیرنیاز داریم :
کلاس Config برای نگهداری تنظیمات
کلاس SqlQuery برای ارتباط با پایگاه داده و اجرای عملیات رو جدول مورد نظر
خوب با هم اولین قسمت رو که نوشتن کلاس Config هست انجام میدیم
این کلاس وظیفه نگهداری تنظیمات کلی فریم ورک رو بر عهده داره.برای اینکه تنظیمات رو یه جایی نگهداری کنیم راههای مختلفی وجود داره.میتونه این تنظیمات به صورت یک کلاس باشه یا میتونه در یک فایل با پسوند ini ذخیره بشه. برای اینکار ما از یک فایل با نام config.ini و یک کلاس برای دسترسی به تنظیمات ذخیره شده توی این فایل نیاز داریم.
یک فایل با نام config.ini توی پوشه library بسازید با این محتویات :
خب یک کلاس با نام Config.php در پوشه library بسازید :
توی این کلاس با استفاده از تابع parse_ini_file محتویات فایل config.ini رو به صورت آرایه در اختیار داریم و سپس با متد Config::get میتونیم به تنظیماتمون دسترسی داشته باشیم.
شاید بپرسید چرا از یک فایل ini برای تنظیمات استفاده کردم.جوابم اینه که میخواستم توی این آموزش یک چیز جدید رو باهم تجربه کنیم.شما از هر روشی که دوست دارید میتونید استفاده کنید.
مشکلی که این روش داره اینه که اگر کاربر آدرس فایل config.ini رو مستقیم توی مرورگر وارد کنه به تنظیمات ما دستری پیدا میکنه که از لحاظ امنیتی مشکل داره.برای رفع این مشکل خط زیر رو به فایل htaccess اضافه میکنیم :
که دسترسی مستقیم به این فایل رو غیرممکن میکنه.
بریم به ادامه مطلب که این بار باید کلاسی بسازیم برای ارتباط و انجام عملیات روی دیتابیس.
برای اینکه فریم ورکمون انعطاف بیشتری داشته باشه باید کلاسی بنویسیم که بتونه با انواع دیتابیس ها ارتباط برقرار کنه.ما کلاس PDO رو انتخاب میکنیم که از هر لحاظ میتونه به ما کمک کنه :
این کلاس خیلی ساده است که امکان اضافه / حذف / ویرایش و انجام کوئری های مورد نظرمون رو میده.
یک دیتابیس با یک جدول بسازید. اسم جدول رو بذارید “articles” و فیلدهای زیر رو بهش اضافه کنید :
id
title
body
حالا چندتا ردیف با مقادیر دلخواه به این جدول اضافه کنید.
یک پوشه با نام model در پوشه ی app بسازید. یک کلاس در این پوشه با نام articles.php ایجاد کنید و کدهای زیررو داخلش قرار بدید :
همینطور که قبلا هم اشاره کردم نام کلاس باید با نام جدول همنام باشن. کلاس articles از کلاس Model ارث بری کرده و به تمام متدهای public و protected اون دسترسی داره. متغیر $table نام جدول رو میگیره که اگر خالی باشه نام کلاس به عنوان نام جدول در نظر گرفته میشه و متغیر $pk نام کلید اصلی رو نگهداری میکنه.
قبل از اینکه کاری انجام بدید یک نکته دیگه رو هم باید اشاره کنم. در سیستم های بزرگ برای جلوگیری از include های پی در پی از تابع autoload استفاده میکنن.
با استفاده از کلاس Load ما دیگه نیازی به include کردن کلاسهامون نداریم.
کدهای زیر رو به فایل index.php اضافه کنید :
و کلاس Load در پوشه library :
با استفاده از متد model میتونیم model مورد نظرمون رو load کنیم.
توی کنترلر ArticleController متد view رو اضافه کنید :
با رفتن به آدرس زیر میتونید نتیجه رو مشاهده کنید :
۱۲۷٫۰٫۰٫۱/article/view/2
خب این قسمت هم به پایان رسید.امیدوارم که مفید بوده باشه.اگر نظر یا سوالی در مورد آموزشها دارن میتونن زیر همین مقاله نظر خودشون رو بگن.اگر هم مشکلی توی آموزشها میبینید میتونید بازهم همینجا بگید خوشحال میشم.
در قسمتهای بعدی به بررسی لایه های Controller و View میپردازیم.
این به این خاطره که کار نگهداری و گسترش در آینده به راحتی انجام بشه .حالا ما هم در این فریم ورک از این روش استفاده میکنیم.
لایه Model ( در فریم ورک ما ) برای ارتباط با دیتابیس باید قابلیت های زیر رو داشته باشه :
ارتباط با پایگاه داده
انجام عملیات اضافه / حذف و ویرایش روی جداول
اجرای کوئری های کاربر
برای داشتن یک فریم ورک خوب و کاربردی باید یک سری پیش نیازها رو قبل از پیاده سازی لایه Model انجام بدیم.پس قبل از پیاده سازی لایه مدل ما به کلاس های زیرنیاز داریم :
کلاس Config برای نگهداری تنظیمات
کلاس SqlQuery برای ارتباط با پایگاه داده و اجرای عملیات رو جدول مورد نظر
خوب با هم اولین قسمت رو که نوشتن کلاس Config هست انجام میدیم
این کلاس وظیفه نگهداری تنظیمات کلی فریم ورک رو بر عهده داره.برای اینکه تنظیمات رو یه جایی نگهداری کنیم راههای مختلفی وجود داره.میتونه این تنظیمات به صورت یک کلاس باشه یا میتونه در یک فایل با پسوند ini ذخیره بشه. برای اینکار ما از یک فایل با نام config.ini و یک کلاس برای دسترسی به تنظیمات ذخیره شده توی این فایل نیاز داریم.
یک فایل با نام config.ini توی پوشه library بسازید با این محتویات :
کد php:
[database]
driver = "Mysql"
dbName = "phpromvc"
dbUsername = "root"
dbPassword = ""
خب یک کلاس با نام Config.php در پوشه library بسازید :
کد php:
<?php
class Config {
static function get($key) {
$config = parse_ini_file(LIB_DIR.DS. 'config.ini');
return $config[$key];
}
}
توی این کلاس با استفاده از تابع parse_ini_file محتویات فایل config.ini رو به صورت آرایه در اختیار داریم و سپس با متد Config::get میتونیم به تنظیماتمون دسترسی داشته باشیم.
شاید بپرسید چرا از یک فایل ini برای تنظیمات استفاده کردم.جوابم اینه که میخواستم توی این آموزش یک چیز جدید رو باهم تجربه کنیم.شما از هر روشی که دوست دارید میتونید استفاده کنید.
مشکلی که این روش داره اینه که اگر کاربر آدرس فایل config.ini رو مستقیم توی مرورگر وارد کنه به تنظیمات ما دستری پیدا میکنه که از لحاظ امنیتی مشکل داره.برای رفع این مشکل خط زیر رو به فایل htaccess اضافه میکنیم :
کد php:
<Files *.ini>
Order deny,allow
Deny from all
</Files>
که دسترسی مستقیم به این فایل رو غیرممکن میکنه.
بریم به ادامه مطلب که این بار باید کلاسی بسازیم برای ارتباط و انجام عملیات روی دیتابیس.
برای اینکه فریم ورکمون انعطاف بیشتری داشته باشه باید کلاسی بنویسیم که بتونه با انواع دیتابیس ها ارتباط برقرار کنه.ما کلاس PDO رو انتخاب میکنیم که از هر لحاظ میتونه به ما کمک کنه :
کد php:
<?php
class Model {
private $_pdo ;
private $_query = '';
protected $table = '';
protected $pk = '';
function __construct() {
$dns = Config::get("driver");
$dbName = Config::get("dbName");
$username = Config::get("dbUsername");
$password = Config::get("dbPassword");
if($this->table == ''){
$this->table = get_class($this);
}
$this->_pdo= new PDO($dns . ':host=localhost;dbname=' . $dbName, $username, $password);
}
function get_rows($fields = '*', $where = ' 1=1 ', $order = 'ASC', $limit = 10) {
$this->_query = "select $fields from {$this->table} where {$where} ORDER BY {$this->pk} $order LIMIT $limit";
$stm = $this->_pdo->query($this->_query);
return $stm->fetchAll();
}
function get_row($fields = '*', $where = ' 1=1 ', $order = '', $limit = 10) {
$this->_query = "select $fields from {$this->table} where {$where} ORDER BY {$this->pk} $order LIMIT $limit";
$stm = $this->_pdo->query($this->_query);
return $stm->fetch();
}
function delete($id) {
$this->_query = "delete from $this->table where id = '$id'";
$this->_pdo->exec($this->_query);
}
function update($data, $where = ' 1 = 1 ') {
$this->_query = " update {$this->table} set $data where $where";
$this->_pdo->exec($this->_query);
}
function insert($fields, $data) {
$this->_query = " insert into $this->table ($fields) VALUES ($data)";
$this->_pdo->exec($this->_query);
}
function run($query) {
$this->query = $query;
$this->_pdo->exec($query);
}
function last_query(){
return $this->_query;
}
}
این کلاس خیلی ساده است که امکان اضافه / حذف / ویرایش و انجام کوئری های مورد نظرمون رو میده.
یک دیتابیس با یک جدول بسازید. اسم جدول رو بذارید “articles” و فیلدهای زیر رو بهش اضافه کنید :
id
title
body
حالا چندتا ردیف با مقادیر دلخواه به این جدول اضافه کنید.
یک پوشه با نام model در پوشه ی app بسازید. یک کلاس در این پوشه با نام articles.php ایجاد کنید و کدهای زیررو داخلش قرار بدید :
کد php:
<?php
class articles extends Model{
protected $table = 'articles';
protected $pk = 'id';
}
همینطور که قبلا هم اشاره کردم نام کلاس باید با نام جدول همنام باشن. کلاس articles از کلاس Model ارث بری کرده و به تمام متدهای public و protected اون دسترسی داره. متغیر $table نام جدول رو میگیره که اگر خالی باشه نام کلاس به عنوان نام جدول در نظر گرفته میشه و متغیر $pk نام کلید اصلی رو نگهداری میکنه.
قبل از اینکه کاری انجام بدید یک نکته دیگه رو هم باید اشاره کنم. در سیستم های بزرگ برای جلوگیری از include های پی در پی از تابع autoload استفاده میکنن.
با استفاده از کلاس Load ما دیگه نیازی به include کردن کلاسهامون نداریم.
کدهای زیر رو به فایل index.php اضافه کنید :
کد php:
define("LIB_DIR" , ROOT.DS.'library');
define("APP_DIR" , ROOT.DS.'app');
include LIB_DIR.DS.'Load.php';
spl_autoload_register(array('Load', 'autoload'));
و کلاس Load در پوشه library :
کد php:
<?php
class Load {
static function autoload($class) {
include LIB_DIR . DS . $class . '.php';
}
static function model($modelName) {
if(file_exists($file = APP_DIR.DS.'model'.DS.$modelName.'.php')){
include $file;
return new $modelName();
}
}
}
با استفاده از متد model میتونیم model مورد نظرمون رو load کنیم.
توی کنترلر ArticleController متد view رو اضافه کنید :
کد php:
<?php
class ArticleController{
function index(){
echo 'IndexController -> index action';
}
function view($id){
$article = Load::model("articles");
$row = $article->get_row('*' , " pro_id = $id ");
print_r($row);
echo $article->last_query();
}
}
با رفتن به آدرس زیر میتونید نتیجه رو مشاهده کنید :
۱۲۷٫۰٫۰٫۱/article/view/2
خب این قسمت هم به پایان رسید.امیدوارم که مفید بوده باشه.اگر نظر یا سوالی در مورد آموزشها دارن میتونن زیر همین مقاله نظر خودشون رو بگن.اگر هم مشکلی توی آموزشها میبینید میتونید بازهم همینجا بگید خوشحال میشم.
در قسمتهای بعدی به بررسی لایه های Controller و View میپردازیم.