Kohana 3 вопрос о структуре модуля - PullRequest
0 голосов
/ 05 сентября 2010

все! У меня новый вопрос о 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 голосов
/ 06 сентября 2010

Нет необходимости расширять 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).

...