[英]Kohana 3 module structure question
大家! 我有一个关于Kohana 3或模块结构的新问题。 我开发了一个名为Textblock的小模块。 它是关于普通页面或网站布局的少量插入(例如,问候语或口号,公司名称)。 它包含控制器和模型。 模型继承Sprig_MPTT。 我想实现的一项功能是可以像这样调用此模块:
$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更改为Jelly,该怎么办? 前景完全不会改变。 imho的另一个优点是,对于想要使用此模块的任何人(例如,它可能是团队中的另一个程序员)而言,其清晰度都更高。
但是我是否会以错误的方式存在疑问...所以,问题本身就是:建议的组织模块的正确方法吗? 还是最好在需要Textblock功能的地方保留普通的Sprig::factory('Textblock')
,删除其他包装器类并删除static
?
无需扩展Model_Textblock
。 您可以创建模型实例并调用其方法:
class Textblock {
public static function get_single($id)
{
return Sprig::factory('textblock')->get_single($id);
}
// etc
}
但是通过这种方式,您应该在静态类(而非DRY)中复制模型方法。 另外,如果您有多个模型怎么办? 您所需要的(据我了解)是轻松更改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)
一样使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.