انجمن عمومی گسترش فناوری آگو
MVC در PHP قسمت سوم :: Model - نسخه‌ی قابل چاپ

+- انجمن عمومی گسترش فناوری آگو (http://forums.ago.ir)
+-- انجمن: انجمن های عمومی گسترش فناوری آگو (/forumdisplay.php?fid=1)
+--- انجمن: برنامه نویسی (/forumdisplay.php?fid=13)
+--- موضوع: MVC در PHP قسمت سوم :: Model (/showthread.php?tid=2207)



MVC در PHP قسمت سوم :: Model - agotd - 11-28-2013 05:23 PM

در این قسمت از سری مقالات MVC در PHP به لایه Model میپردازیم.همینطور که در قسمت اول اشاره شد لایه Model وظیفه ارتباط با پایگاه داده رو داره. در معماری MVC و کلا سیستم هایی که به صورت شیء گرا نوشته میشن معمولا برای هر کدوم از جدولهای دیتابیس یک کلاس جدا باید داشته باشیم.

این به این خاطره که کار نگهداری و گسترش در آینده به راحتی انجام بشه .حالا ما هم در این فریم ورک از این روش استفاده میکنیم.

لایه 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 میپردازیم.


RE: MVC در PHP قسمت سوم :: Model - abbas00 - 01-18-2014 10:33 PM

با تشکر از آموزش خوبتون

اگه میشه این خط رو که در index.php نوشتید رو توضیح بدبد:
spl_autoload_register(array('Load', autolo


RE: MVC در PHP قسمت سوم :: Model - agotd - 01-25-2014 01:43 PM

دوست عزیز سلام

من عذر می خوام هم به دلیل اینکه دیر پاسخگو بودم و هم به خاطر اینکه اون تیکه از کد با مشکل درج شده بود

الان درستش کردم باز هم اگر سوالی بود در خدمت هستم

با تشکر