2012-10-18 57 views
4

我想構建一個簡單的MVC框架,以更好地理解某些概念。我認爲首要解決的重要問題是前端控制器,它處理我的應用程序的所有請求。自動加載器應該在MVC中去哪裏?

一旦我開始思考它,我不確定加載我的應用程序將使用的類的最佳方式。我目前的思考過程是我的自動加載器應該位於前端控制器中,因爲每個請求都使用它。大多數框架通常把這個放在哪裏?通過幾個已經構建的框架,對我來說幫助不大,因爲許多功能遠遠超出了我的需要,使其變得複雜,以至於很難理解。

,我試圖使用的類加載器可以在這裏找到https://gist.github.com/221634

只是想弄清楚如何適當地建立和組織一個簡單的MVC框架。

+3

自動加載器技術上不是MVC模式的一部分,它只是一個按需查找和加載類的機制。您也可以靜態加載所有的MVC類,並且根本不使用自動加載器;另一方面,即使與MVC模式無關,也可以爲所使用的任何類使用自動加載器。 – lanzz

+0

對不起,我不打算聽起來像我認爲自動裝載機是特定於MVC模式。我只是不確定它通常位於此設置的位置。 – ohiock

+0

'index.php'文件包含'../ app/boostrap.php'。 bootstrap包含'../ lib/someautoloader.php',然後初始化自動加載器。 –

回答

3

你應該把它放在你的引導文件中。

這是你如何能做到這一點:

  1. 隊每個HTTP請求到前端控制器的index.php,app.php還是怎麼過,你怎麼稱呼它。
  2. Front Controller可以定義框架中使用的一些常量,然後包含您的Bootstrap.php文件。 Bootstrap將啓動您的應用程序。
  3. 現在,我在Bootstrap中做的第一件事就是註冊自動加載。通過這種方式,我可以輕鬆獲得\ System \ Router \ Router類或\ System \ Router \ Dispatcher類,從而獲得重點。

還有一件事,您甚至可以使用PSR0類加載程序註冊您的應用程序Models文件夾。 因此,可以說,你的模型文件夾是這樣的:

application/Models/ 
    - Entities 
    - Services 
     Email.php 
     Cache.php 

從你的控制器內就可以輕鬆搞定模型這樣

public function someController() 
{ 
    $email = new \Models\Services\Email(); 
    // Do stuff with email service 
}  

這麼短回答你的問題是最好的事情有是第一個Front Controller,它爲您提供了一些「擺動」空間,然後從那裏加載啓動應用程序的Bootstrap,Bootstrap中的第一件事是要求您的類加載器以及要通過應用程序使用的寄存器庫。

然後你甚至可以註冊自動加載的應用程序控制器和模型的文件夾,並在系統啓動文件的末尾,當你即將派遣要求,您可以要求控制器是這樣的:

$app = new '\\Application\\Controllers\\' . $class; 
// Dispatch request with call_user_func_array or ReflectionMethod and ReflectionClass 

無需要求Controller類自動加載,只需提供正確的名稱空間即可。

偉大的問題,希望這有助於!很高興看到其他人玩弄他們的custome MVC :)

+1

感謝您提供簡單的例子 - 它們的確幫助我更容易理解事物。 – ohiock

2

絕對是在引導階段!

自動加載器應該是每個PHP應用程序的一部分,它應該是初始化的第一個類/代碼中的一個。

我的MVC初始化步驟:

  • 指數爲切入點
  • 引導初始化錯誤處理,自動加載機和IoC
  • 應用,主要是一個MVC應用程序
  • 路由機制
  • 控制器
  • model
  • 查看
1

那麼,問題「它到哪裏去了?」對我來說,提出了兩個更精確的問題:

  1. 存儲的文件在哪裏包含autoloader函數/類定義?
  2. 在你的請求調度週期中,它應該被實例化,配置並允許發揮它的魔力?

第一個問題 - 「何處放置包含該類的文件?」 - 對於您來說可能並不那麼重要,因爲您已經確定了要使用的自動裝載機類。確切的答案取決於您自己的框架應用程序結構,但對於像您所引用的那樣的外部開發類,libvendor目錄中的某個位置可能是有意義的。

對於第二個問題 - 「何處實例化,配置等?」 - 答案是:儘可能早地在請求週期中,因此您可以獲得後面引用的所有類的自動加載的好處。實際上,這可能意味着引導過程中的某個地方。

當然,這通常意味着爲了加載自動加載器類,您可能必須執行手動調用,實例化自動加載器對象,並使用命名空間和路徑對其進行配置。

+0

所以對我來說最好的方法是創建autloader文件,將它放在我的MVC文件的outisde目錄中。然後,在我的前端控制器中實例化這個類,從那裏我應該很好地利用任何類,只要我喜歡,在我的MVC中的任何文件? – ohiock

+0

正確的,引導程序可以設置自動加載,這兩者都可能在Web請求的上下文之外潛在可用(可能用於CLI請求)。然後,對於Web請求,您可以創建您爲框架設想的任何MVC組件(例如:前端控制器,路由器,調度程序,控制器,視圖等)。 –