2011-12-18 75 views
2

我正在構建一個小型框架,我可以將它用於未來小型項目的重複世俗的東西。如何訪問控制器內的庫?

我被困在從控制器內部訪問庫的最佳方式。我最初實現了一個類似於CodeIgniter的系統,其中我的主控制器類基本上是一個超級對象,並將所有類加載到類變量中,然後通過擴展控制器來訪問,然後像$this->class->method()

我發現有點難看。所以我想到了在每個控制器方法中,按照每個使用的情況逐個加載每個類。

這樣做最好(最乾淨)的方式是什麼?

回答

2

爲了每個類只有一個實例,您可以創建一個簡單的服務容器。

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); 
} 

簡單的例子,顯然需要大量的工作,使可用(例如自動加載需要和處理的文件路徑的易用性,或者更簡單的方法來添加服務沒有得到他們等)。

+0

這就是我最終的目標。但是這個語法看起來太長了,所以我只是用一個靜態數組來處理一個過程函數。 – CrazeD 2011-12-18 03:00:57

2

我不喜歡CodeIgniter的做法。它從來沒有像我這樣做。我喜歡將自動加載類壓入spl_autoload棧。然後只需調用類爲正常,如:

$class = new SomeClass();

+0

但是如果我需要在別的地方同時使用這個類而又不想實例化它呢?我應該只是讓我所有的圖書館單身?或者我應該創建一個函數來加載爲對象分配一個靜態數組的類,然後如果它已經被加載(CodeIgniter的方法)就返回對象? – CrazeD 2011-12-18 00:54:13

+1

@CrazeD如果這是你需要的,那麼實現單例沒有什麼錯誤。 – kba 2011-12-18 01:03:19