2011-04-06 3 views
1

저는 Object Oriented PHP 및 MVC에 조금 익숙하므로 좀 도와주세요.밑줄 (PEAR 스타일) 표기법을 사용하는 하위 폴더에서 자동로드 PHP 클래스

파일 시스템에 하위 폴더가있는 MVC 스타일 폴더 구조가 있습니다.
- 예 :. view/classes/subfolder/classname.php

인간 친숙적 URL에 mod_rewrite를 사용하고 있습니다 (/classname 또는 /foldername/calssname). 페이지 로더에 밑줄로 구분 된 값으로 전달됩니다.
- 예 : [/ 다른/다른 경우 경우 각 가능한 폴더에 테스트 차단 그러나 이것은 비효율적 인 것 같다, 그래서 foldername_classname

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

것은 내가 이전에 사용하고는 I 많은에서 오토로더 모양을 가지고 더 나은 방법을 찾고 있어요 다른 위치.

여기에 요청 된 클래스 중 하나를 찾기 위해 관리하지 않습니다 내 최신 실패, 그리고 단지 각각 나는 또한이었다 치명적인 오류! :

 
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;
폴더 아래의 클래스 파일 이름이 classname.php 인 ;
및 PHP 클래스 정의 class foldername_classname extends another_class { etc.

올바른 방법입니까?

답변

4

우연히 a different matter과 관련하여 the solution to my problem을 발견했습니다!

그래서 내 자신의 질문에 대답하는 (잘하면 다른 사람을 돕는) :

  • 파일 이름은 폴더 구조가지도해야한다
    .../not-this-part/but-this
  • URL의 단지 마지막 부분이되어야한다 URL 구조
    예 : .../folder/subfolder/class
  • 이며 클래스는 전체 경로로 정의해야하지만 슬래시 대신 밑줄을 사용하여 정의해야합니다.
    예 : class folder_subfolder_class {

는 I는 각 클래스 시스템 (모델 뷰 & 컨트롤러) 함수를 작성하고 __autoload 기능 등 각각의 기능을 등록 spl_autoload_register() 사용. 따라서 ... mod_rewrite 부분에 대해 궁금 분들을 위해

 
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'); 
... 

...

 
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