2016-06-22 40 views
1

下面的例子顯示了我目前正在做的事情。MVC - 尋找更好的方法從URL獲取

index.php包括index_controller.php然後index_template.php。

index_controller.php

$uri = explode('/', $_SERVER['REQUEST_URI']); 
$action = $uri[1]; 
$call = $uri[2]; 

$tmp = explode('?', $call); 
$call = $tmp[0]; 

$call = preg_replace('/-/', ' ', $call); 

switch ($action) { 
    case "about": 
     $page = "about.inc.php"; 
     $title = "About Us"; 
     $description = "Description of page"; 
     break; 
    case "category": 
     try { 
      //PDO query to make sure category ($call) exists 
     } 
     catch (PDOException $e) { 
      logError($e->getMessage()); 
     } 
     if (query->rowCount() < 1) { 
      $page = "404.inc.php"; 
      $title = "404 Error"; 
     } 
     else { 
      //Meta information for selected category pulled from DB and put into variables. 
      $page = "category.inc.php"; 
     break; 
    default: 
     $page = "404.inc.php"; 
     $title = "404 Error"; 
} 

上面的例子示出的switch語句中大約12不同頁面選項2。一個簡單的請求(約)和一個更復雜的請求(類別)。

index_template.php擁有我所有的頭,身和頁腳HTML。它設置爲頁面的元數據,建立了網站的結構,包括任何文件$page變量被設置爲index_controller.php

使用上面的例子,如果有人去mysite.com/category/booksindex_controller.php將會查看書籍類別是否存在,以及是否包含category.inc.php

category.inc.php執行另一個PDO查詢以獲取顯示所選類別的項目列表所需的所有項目和信息。它還包含一個模板文件來構建返回項目的顯示。

我想實現一個MVC類型的結構(不使用像Codeigniter或CakePHP框架),但我真的沒有模型結束。

如何使用類和/或函數而不是我目前使用的所有包含從URL到視圖的用戶?

如果您覺得我沒有很好地解釋提及的其他文件,我也可以從這些文件中提供代碼示例。

任何幫助,輸入或建議將不勝感激。

編輯:根據下面的評論澄清問題。

+0

這是一個相當廣泛的問題 - 它幾乎讀作「我怎樣才能建立一個MVC框架?」這個問題的標題暗示了一些更具體的內容,但你從來沒有真正澄清過。如果你還沒有,請看看[幫助],因爲了解這個網站與普通論壇的不同之處很重要:你不開始對話,所以你需要關注一個特定的問題,並且確保它是該網站的「主題」。 – IMSoP

+0

@IMSoP很抱歉的問題很多。我編輯它試圖澄清實際問題。希望這有助於更好地瞭解我所尋找的內容。 – Jay

回答

0

隨着一個小技巧和.htaccess你可以使這更容易。

我在我自制的基於MVC的應用程序中使用此方法。您可以複製粘貼整個代碼或僅使用它的一部分。主要邏輯在Bootstrap類中。

的.htaccess

Options -Indexes 

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] 
RewriteRule ^$ /news [R] 

的index.php

require 'brInit.php'; 

$app = new \brInclude\brClasses\mvc\Bootstrap(); 

我用brInit自動包括類,幷包括我的配置文件

bootstrap.php中

class Bootstrap { 
    private $url = array(); 
    /** @var Controller $controller */ 
    private $controller; 

    function __construct(){ 
     try { 
      $this->_getUrl(); 

      $this->_loginUser(); 

      if(!$this->_setController($this->url[0])) 
       throw new Exception('404'); 

      if(!$this->_executeControllersMethod()) 
       throw new Exception('404'); 
     } catch(Exception $e){ 
      $this->_error($e->getMessage()); 
     } 
    } 

    private function _error($msg){ 
     $this->url = array('Error', 'error', $msg); 
     $this->_setController($this->url[0]); 
     $this->_loginUser(); 
     $this->_executeControllersMethod(); 
    } 

    private function _getUrl(){ 
     if(isset($_GET['url'])) 
      $this->url = explode('/', rtrim($_GET['url'], '/')); 
     else 
      $this->url = array('news'); 

     unset($_GET['url']); 
    } 

    private function _setController($name){ 
     $path = 'brInclude/brMVC/controller/'; 
     if(!file_exists($path)) return false; 

     $url = ucfirst($name) . 'Controller'; 
     $namespace = str_replace('/', '\\', $path); 
     $file = $path . $url . '.php'; 
     if(!file_exists($file)) return false; 

     $classWithNamespace = $namespace . $url; 
     $this->controller = new $classWithNamespace; 
     $this->controller->view->name = $name; 
     return true; 
    } 

    private function _loginUser(){ 
     $model = new UserModel(); 
     $user = $model->login(); 
     Controller::$user = $user; 
    } 

    private function _executeControllersMethod(){ 
     if(isset($this->url[1])){ 
      if(method_exists($this->controller, $this->url[1])){ 
       $count = count($this->url); 
       if($count > 2) 
        call_user_func_array(
         array($this->controller, $this->url[1]), 
         array_slice($this->url, 2) 
        ); 
       else 
        $this->controller->{$this->url[1]}(); 
      } else { 
       return false; 
      } 
     } else { 
      $this->controller->index(); 
     } 
     return true; 
    } 

    public static function isLoginRequired(){ 
     return self::$loginRequired; 
    } 
} 
+0

嗨:)這裏有很多代碼,並沒有很多解釋(甚至在代碼中的註釋)。什麼是「小動作」?你認爲哪部分代碼與問題特別相關? (我意識到這個問題本身是相當廣泛的......) – IMSoP

+0

嗨!對不起這是我的錯。所以我在這裏使用'.htaccess'來傳遞請求uri作爲get參數,然後在php中分割它。有了這個,我得到一個數組。數組的第一項聲明瞭它應該包含哪個Controller(你可以設置一個默認的控制器,但是當沒有設置時,我使用'.htaccess'來重定向)。第二項是如果所選控制器和所有其他項目是該方法的參數的方法。 – Nergal

+0

@Nergal謝謝你的回答!這看起來比我目前做事情要乾淨得多。在我的代碼中使用你的例子的部分將幫助我找到我正在尋找的路徑。 – Jay