2010-09-05 111 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