2011-04-06 81 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 
相关问题