2014-04-11 40 views
4

林建設一個MVC的PHP框架,並因與自動加載我的班,我認爲可能是記在我的文件結構的一些問題。文件目錄和自動加載的問題PHP MVC

首先,這裏是我的文件結構:

enter image description here

林測試在XAMPP的LocalServer環境中開發所以這就是爲什麼我的私人和公共文件夾。最終在活服務器上,私人文件夾將位於服務器根目錄中,公用文件夾將位於public_html目錄中。

難道我的文件結構看有關的權利?在私人的前端文件夾中,我的所有不同的模塊都在directorys中,其中有一個控制器,模型,視圖文件,它們爲每個模塊保存必要的文件。

我到目前爲止創建此自動加載機:

//Require config and router classes 
require_once('router.class.php'); 
require_once('config.php'); 

spl_autoload_register(null, false); 

spl_autoload_extensions('.class.php'); 

function autoloader_core($class){ 
    $filename = strtolower($class) . '.class.php'; 

    if(!file_exists($filename)){ 
     echo $filename . " not found"; 
    } 
    include $filename; 
} 

function autoloader_app($class){ 
    $filename = strtolower($class) . '.class.php'; 
    $file = 'C:\xampp\htdocs\simplebids\simplebidsprivate\app/' . $filename; 

    if(!file_exists($file)){ 
     echo $file . " not found"; 
    } 
    include $file; 
} 

spl_autoload_register('autoloader_core'); 
spl_autoload_register('autoloader_app'); 

$router = new test; 
$router->say_hello(); 

此作品完美的lib->核心目錄中的類,但是當我嘗試實例化一個新的測試類我得到的所有有關類型的錯誤沒有在lib-> core文件中找到test.class.php文件,這顯然不是,但我認爲autoloader函數將在我自己定義的「autoloader_app」函數中尋找路徑。

有趣的是,即使我得到所有這些錯誤,我在測試功能say_hello呼應的字符串()並獲取錯誤後迴盪。

因此,在短期的文件心不是根據錯誤被發現,但它是因爲我可以看到我做的類功能打印迴音。

任何想法爲什麼?

而且我的前端模塊的文件結構,這是怎麼回事,使自動加載非常困難,因爲生病需要爲每個模塊不同的自動加載功能,然後每控制器/模型/視圖在它的文件嗎?我需要爲每個模塊提供獨立的自動加載功能嗎?如果不是,我會怎麼做呢?

感謝 湯姆

+0

你會在哪裏配置你的配置文件。另外,請嘗試添加插件功能。如果您期待公開使用公共框架 – Guns

+0

,那麼在稍後的階段就需要這樣做,但並不真正回答您的具體問題,但是當涉及到自動加載時,您應該看看PSR-0(也許還有PSR-4)。如果你這樣做,那麼你將能夠混合並匹配符合PSR的其他框架詞(和其他方式)。 http://www.php-fig.org/psr/psr-0/ – Sarel

+0

你應該開始使用命名空間(PSR-0會給你從哪裏開始的方向)..並停止在文件中使用'.class'名字,因爲並非所有你加載的東西都是類。 –

回答

1

我建議以下辦法。這是我用我自己的項目(包括一個MVC框架)

首先,遵循以下規則:每個文件

  • 一類/特徵/接口。
  • 使用小寫類/特徵/接口名稱,作爲文件名。例如。 Foo類將是「foo.php」
  • 將命名空間類/特徵/接口文件存儲在與名稱空間匹配的目錄樹中,並使用小寫名稱。例如班\ Foo \ Bar \ Baz將是「/ foo/bar/baz。PHP的」

然後,激活你見過的最簡單的自動加載:包含所有類文件

添加主任(Y/IES)/目錄到PHP包括路徑:

set_include_path(get_include_path() . PATH_SEPARATOR . ROOT_DIR . "/lib"); 

加載內置自動加載磁帶機:

spl_autoload_register('spl_autoload', false); 

因此,要舉一個例子,這是我的應用程序的目錄結構一般爲:

Project Root/ 
|-apptopnamespace/ 
| |-controllers/ 
| | |-dashboard.php 
| | |-users.php 
| |-models/ 
| | |-user.php 
| | |-item.php 
| |-etc/ 
| |-appname.php 
| |-router.php 
|-bootstrap.php 

爲了簡化它,該框架有一個像自動加載設置的東西的方法,包括路徑等

所以下面呼叫在bootstrap.php製成。該參數可以很容易地在陣列中更多的路徑(例如[__DIR__, __DIR__ . DIRECTORY_SEPARATOR . 'lib']如果你有項目文件夾嵌套「lib」目錄):

Bamboo::configure([__DIR__]); 

內部則框架(除其他事項外)調用這兩個方法:

/** 
* Add one or more paths to the include path 
* 
* @param array $paths an array of paths to add to the include path 
*/ 
protected static function addIncludePath(array $paths) { 
    set_include_path(
     get_include_path() . PATH_SEPARATOR . implode(
      PATH_SEPARATOR, 
      $paths 
     ) 
    ); 
} 

/** 
* Register the SPL Autoloader 
*/ 
protected static function setupAutoload() { 
    // Don't clobber any __autoload already defined 
    if (function_exists('__autoload')) { 
     spl_autoload_register('__autoload', false); 
    } 

    spl_autoload_register('spl_autoload', false); 
}