2010-09-05 51 views
0

大家好!我有一個關於Kohana 3的新問題,或者是關於模塊結構。我開發了一個名爲Textblock的小模塊。這是關於一個普通頁面或插入到網站佈局的小插圖(例如問候語或口號,公司名稱)。它包含控制器和模型。模型繼承了Sprig_MPTT。和一個功能,我想實現是一個可能能夠調用此模塊是這樣的:Kohana 3模塊結構問題

$textblock = Textblock::get_single(1);  //by id 
$children = Textblock::get_children_of(4); //id of parent 

,而不是

$textblock = Sprig::factory('Textblock')->get_single(1); 
$children = Sprig::factory('Textblock')->get_children_of(4); 

這些方法在Model_Textblock類定義爲static

所以,我做了一個包裝類Textblock,它繼承了Model_Textblock。例如,如果我突然想要更改Sprig to Jelly?前景不會改變。另一個優勢是,對於想要使用此模塊的任何人(例如,它可能是團隊中的另一位程序員),更清晰。

但是,如果我的方式不正確,有一個疑問...所以,這個問題本身:是建議一個正確的方式來組織我的模塊?或者最好保持普通Sprig::factory('Textblock')需要Textblock的功能,刪除額外的包裝類,並刪除static

回答

0

沒有必要延長Model_Textblock。您可以創建一個模型實例並調用其方法:

class Textblock { 
    public static function get_single($id) 
    { 
     return Sprig::factory('textblock')->get_single($id); 
    } 
    // etc 
} 

但這種方式,你應該在你的靜態類的複製模型的方法(未乾)。另外,如果你有多個模型呢?所有你想要的(據我所知)是很容易改變AR驅動程序。所以我想這種類:

class Textblock { 

    // saved objects, dont create on model twice 
    protected static $_instances = array(); 

    public static function model($name) 
    { 
     if (! isset(self::$_instances[$name])) 
     { 
      $model = Sprig_MPTT::factory($name); 
      // you can add try..catch to prevent exceptions 
      // or add another checks 
      self::$_instances[$name] = $model; 
     } 
     return clone self::$_instances[$name]; 
    } 
} 

並使用它像Textblock::model('textblock')->get_single($id)

+0

感謝您的評論。是的,我想讓我的模塊在任何地方都不可改變。當Textblock沒有繼承Model_Textblock時,我喜歡這個想法,因爲我認爲一個模塊必須爲最終用戶提供一組包含最必要邏輯的有限方法。你怎麼看待這件事?關於多個模型:通常我每個實體都有一個模型。 – franzose 2010-09-06 07:38:34