Kohana 3模块结构问题

时间:2010-09-05 14:35:59

标签: php kohana static-methods kohana-3

大家好!我有一个关于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的另一个优势是更清晰(例如,它可能是团队中的另一个程序员)。

但是,如果我的方法不对,那就有疑问......所以,问题本身:建议组织我的模块的正确方法是什么?或者最好保持普通Sprig::factory('Textblock')需要Textblock的功能,删除其他包装类并删除static

1 个答案:

答案 0 :(得分:0)

无需延长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)一样使用它。