如何使用自定义PHP MVC在另一个控制器中加载模型

时间:2015-08-30 10:43:41

标签: php model-view-controller

我的应用程序有这个文件夹结构:

  

      
  • 申请

         
        

          
    • 文库

               
            
              
      • Model.php
      •       
      • Controller.php这样
      •       
      • View.php
      •       
          
    •     
    • 模型          
            
      • Settings_Model.php
      •     
      • Home_Model.php
      •     
        
         
        
          
    • 控制器          
            
              
      • 的settings.php
      •       
      • home.php
      •       
          
    •     
    • 视图          
            
              
      • 设置              
                
                  
        • 的index.php
        •         
              
      •       
      •              
                
                  
        • 的index.php
        •         
              
      •       
          
    •     
      
  •   
  • 的index.php
  •   
  • 的.htaccess
  •   
  

库/ Model.php

 class Database extends PDO{
        public function __construct($DB_TYPE, $DB_HOST, $DB_NAME, $DB_USER, $DB_PASS){
              parent::__construct($DB_TYPE.':host='.$DB_HOST.';dbname='.$DB_NAME, $DB_USER, $DB_PASS);       
        }
  }

库/控制器

 class Controller{

      function __construct(){       
           $this->view = new View();
      }

      public function loadModel($name){
           $path = 'application/models/' . $name . '_model.php';

           if(file_exists($path)){
                require 'application/models/' . $name . '_model.php';
                $modelName = $name . '_Model';
                $this->model = new $modelName();            
           }
      }
 }

库/视图

 class View{

      function __construct(){       
           $this->view = new View();
      }

      public function render($name){
           require 'application/views/' . $name . '.php';
      }
 }

模型文件夹中,我创建了名为 Settings_Model.php 的模型: models / Settings_Model.php

 class Settings_Model extends Model{
    public function __construct(){parent::__construct();}

    function settings(){
       $stmt = $this->db->prepare("SELECT * FROM `mv_settings`");
       $stmt->execute();
       $stmt->setFetchMode(PDO::FETCH_OBJ);
       return $stmt->fetch();
    }       
 }

控制器文件夹中,我将此控制器称为 settings.php :   controllers / settings.php

class Settings extends Controller {

    function __construct(){parent::__construct();}

    public function index(){    
        $this->view->settings = $this->model->settings();   
        $this->view->render('settings/index');      
    }   
}

观看文件夹中,我创建了一个名为设置的文件夹,在此文件夹中我创建了一个 index.php 文件:  设置/索引

这是如何调用settings / index中的settings方法:

  

$this->settings->fieldName;

现在,当我们转到主页视图时,我执行了相同的操作:   - 创建一个Home_Model类,在这个模型中我创建了相同的设置方法:

 class Home_Model extends Model{
    public function __construct(){parent::__construct();}

    function settings(){
       $stmt = $this->db->prepare("SELECT * FROM `mv_settings`");
       $stmt->execute();
       $stmt->setFetchMode(PDO::FETCH_OBJ);
       return $stmt->fetch();
    }       
 }

然后转到controllers文件夹并创建主页控制器:

class Home extends Controller {

    function __construct(){parent::__construct();}

    public function index(){    
        $this->view->settings = $this->model->settings();   
        $this->view->render('home/index');      
    }   
}

然后调用home / index中的settings方法:

  

$this->settings->fieldName;

我想问的是,每次我们需要在另一个视图文件中调用该方法时,如何避免不要一次又一次地创建相同的方法设置

  

NB :我还是新手。

2 个答案:

答案 0 :(得分:0)

在你的控制器中试试这个

class Settings extends Controller {
   function __construct(){
     parent::__construct();
     $this->load->model('Settings_Model');
   }
   public function index(){    
     $this->view->settings = $this->Settings_Model->settings();   
     $this->view->render('settings/index');      
   }   
}

答案 1 :(得分:0)

如果你想在所有模型中访问相同的settings()函数,那么你应该在Base model.php中创建它。

class Model{


  function settings(){
       $stmt = $this->db->prepare("SELECT * FROM `mv_settings`");
       $stmt->execute();
       $stmt->setFetchMode(PDO::FETCH_OBJ);
       return $stmt->fetch();
    }

  }

然后你的设置模型必须像

 class Settings_Model extends Model{
    public function __construct(){parent::__construct();}

 }

和你的Home_model

 class Home_Model extends Model{
    public function __construct(){parent::__construct();}

 }

现在您可以在扩展模型的所有模型中访问settings(),无需一次又一次地创建它。