我正在構建一個小型框架,我可以將它用於未來小型項目的重複世俗的東西。如何訪問控制器內的庫?
我被困在從控制器內部訪問庫的最佳方式。我最初實現了一個類似於CodeIgniter的系統,其中我的主控制器類基本上是一個超級對象,並將所有類加載到類變量中,然後通過擴展控制器來訪問,然後像$this->class->method()
我發現有點難看。所以我想到了在每個控制器方法中,按照每個使用的情況逐個加載每個類。
這樣做最好(最乾淨)的方式是什麼?
我正在構建一個小型框架,我可以將它用於未來小型項目的重複世俗的東西。如何訪問控制器內的庫?
我被困在從控制器內部訪問庫的最佳方式。我最初實現了一個類似於CodeIgniter的系統,其中我的主控制器類基本上是一個超級對象,並將所有類加載到類變量中,然後通過擴展控制器來訪問,然後像$this->class->method()
我發現有點難看。所以我想到了在每個控制器方法中,按照每個使用的情況逐個加載每個類。
這樣做最好(最乾淨)的方式是什麼?
爲了每個類只有一個實例,您可以創建一個簡單的服務容器。
class ServiceContainer
{
protected $services;
public function get($className)
{
if (!array_key_exists($className, $this->services)) {
$this->services[$className] = new $className;
}
return $this->services[$className]
}
}
然後爲每個應用程序創建一個ServiceContainer實例。注入容器到所有的控制器,並使用
public function someAction()
{
$this->container->get('Mailer')->send($email_data);
}
簡單的例子,顯然需要大量的工作,使可用(例如自動加載需要和處理的文件路徑的易用性,或者更簡單的方法來添加服務沒有得到他們等)。
PHP提供了自動載入功能與SPL和spl_autoload(以及相關的功能)。您可以爲您的庫代碼註冊自定義自動加載器。
對於您的應用程序處理的共享功能,您是否考慮過Front Controller design pattern?
這就是我最終的目標。但是這個語法看起來太長了,所以我只是用一個靜態數組來處理一個過程函數。 – CrazeD 2011-12-18 03:00:57