2011-04-06 48 views
1

我對面向對象的PHP和MVC有點新,所以我真的需要一些幫助。使用下劃線(PEAR樣式)自動加載子文件夾中的php類

我有一個MVC風格的文件夾結構,在文件系統中有子文件夾
- view/classes/subfolder/classname.php

我使用mod_rewrite對人類友好的URL,如/classname/foldername/calssname,隨後傳遞到頁面加載器下劃線分隔值。
- 例如foldername_classname

 
// Page Loader File 
require_once($_SERVER['DOCUMENT_ROOT'].'/local/classLoader.php'); 
session_start(); 
$page = new $_REQUEST['page']; 

我以前一直用的[if/else語句的if/else()塊在每一個可能的文件夾中進行測試,但是這似乎效率不高,所以我在尋找一個更好的方式來在許多磁帶自動加載機的外觀不同的地點。

這是我最新的失敗,不設法找到任何請求的類的,只是輸出例外每一個致命的錯誤!:

 
function classToPath($class) { 
    $path = str_replace('_', '/', $class) . '.php'; 
    return $path; 
} 

function autoloadController($class) { 
    echo 'LoadController'.'
'; $root = '/controller/classes/'; $pathtoclass = $root.classToPath($class); try { if(file_exists($pathtoclass)) require_once($pathtoclass); else throw new Exception('Cannot load controller '.$class); } catch(Exception $e) { echo 'Controller exception: ' . $e->getMessage() . "
"; } } function autoloadModel($class) { echo 'LoadModel'.'
'; $root = '/model/classes/'; $pathtoclass = $root.classToPath($class); try { if(file_exists($pathtoclass)) require_once($pathtoclass); else throw new Exception('Cannot load model '.$class); } catch(Exception $e) { echo 'Model exception: ' . $e->getMessage() . "
"; } } function autoloadView($class) { echo 'LoadView'.'
'; $root = '/view/classes/'; $pathtoclass = $root.classToPath($class); try { if(file_exists($pathtoclass)) require_once($pathtoclass); else throw new Exception('Cannot load view '.$class); } catch(Exception $e) { echo 'View exception: ' . $e->getMessage() . "
"; } } spl_autoload_register('autoloadController'); spl_autoload_register('autoloadModel'); spl_autoload_register('autoloadView');



我也結束了想知道到文件夾/類映射的URL應該如何工作:
- 即URL: /foldername/classname mod_rewritten到 foldername_classname;
,在 foldername文件夾下的類文件名爲 classname.php;
和php類定義 class foldername_classname extends another_class { etc.

這是正確的方法嗎?

回答

4

寧可碰碰運氣,關於a different matter,我找到了the solution to my problem

因此,要回答自己的問題(並希望幫助他人):

  • 的文件名應該只是URL的最後一部分
    .../not-this-part/but-this
  • 的文件夾結構應該是地圖上的URL結構
    eg .../folder/subfolder/class
  • 並且該類應該定義爲完整路徑,但帶有下劃線而不是正斜槓
    例如, class folder_subfolder_class {

我然後寫一個函數爲每一類系統(模型,視圖&控制器),並用於spl_autoload_register()註冊每個函數作爲__autoload功能。因此...

 
function loadController($class) { 
    $path = $_SERVER['DOCUMENT_ROOT'].'/application/controller/'; 
    $filename = str_replace('_', DIRECTORY_SEPARATOR, strtolower($class)).'.php'; 

    if(file_exists($path.$filename)) { 
     require_once($path.$filename); 
    } 
} 
etc..etc.. 
spl_autoload_register('loadController'); 
... 

對於那些想知道的mod_rewrite部分...

 
IfModule mod_rewrite.c 
    RewriteEngine On 

    RewriteBase/

    RewriteCond %{SCRIPT_FILENAME} !-f 
    RewriteCond %{SCRIPT_FILENAME} !-d 

    RewriteRule ^([a-z]+)/([a-z]+)/?$ /?page=$1_$2 [QSA,NC,L] 
    RewriteRule ^([a-z]+)/?$ /?page=$1 [QSA,NC,L] 
/IfModule 
相關問題