繁体   English   中英

Kohana 3模块结构问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM