Kohana 3.3 - как правильно перенести функцию контроллера в модель
Снова у меня вопрос о Kohana и о том, как я должен использовать модельные функции.
Я хочу переместить части функции контроллера в более подходящую модель, чтобы иметь возможность доступа к этой функции из дополнительных контроллеров. (Из того, что я прочитал, я заключаю, что вызов функции контроллера из другого контроллера считается плохой архитектурой). Моя проблема заключается в том, что в зависимости от нескольких обстоятельств (то есть параметров модели) эта функция контроллера создает запись журнала в другой таблице базы данных и отправляет электронное письмо некоторым пользователям.
Как я должен создать эту запись в журнале и отправлять письма, если основные функции находятся внутри модели? Должен ли я создавать вторую модель из первой, вызывать функцию log, а затем отправлять письма точно так же, как я делал с моего контроллера?
Заранее спасибо.
1 ответ
На этот вопрос, к сожалению, нет 1 правильного ответа. Во многом это зависит от того, как вы предпочитаете реализовывать шаблон MVC.
В своей основе MVC использует: Модели, Представления и Контроллеры
МоделиЭти классы должны представлять сущности в вашей базе данных.
Пример:
Model_User сопоставляется с сущностью в вашей таблице Users
$user = new Model_User;
$user->first_name = 'Joe';
$user->last_name = 'Smith';
$user->save();
Представления Вэтих файлах хранятся данные / шаблоны презентаций (обычно html / в основном)
Пример:
index.tpl
<h1>HELLO, WORLD!</h1>
<h2><?=$some_variable_from_controller?></h2>
КонтроллерыЭти файлы обрабатывают входящие запросы и обрабатывают данные для внедрения в представления.
Пример:
Controller_Home обрабатывает запрос к домашней странице
class Controller_Home extends Controller {
public function action_index(){
$view = View::factory('index');
$view->render();
}
}
Теперь, когда вы получили основы, пришло время понять конкретную проблему, которую продвигает эта ограниченная структура. Контроллеры становятся немного жирными и грязными. Это приводит нас к библиотекам или сервис-ориентированной архитектуре.
Эти библиотеки позволяют нам перемещать большие группы логики в переносимый сервисный уровень, который можно легко использовать на всех контроллерах, моделях и других библиотеках. Они также разбивают наш код на более мелкие и краткие куски, которые действительно имеют смысл.
Пример:
В моем контроллере вместо использования логики, которая регистрирует пользователя через Facebook, я могу просто создать Social_Login_Service и использовать его следующим образом.
Social_Login_Service::facebook($user_email);
Теперь вы просто увидите одну чистую строку в вашем контроллере входа в систему, а не целую кучу логики, которая будет накапливаться в вашем контроллере до тех пор, пока он не растопит ваш мозг.
Это очень простой обзор возможного направления (и тот, который я предпочитаю).
Очень полезно разбить ваши сайты на более мелкие компоненты, и если вы используете Kohana, я рекомендую делать это с модулями ( http://kohanaframework.org/3.1/guide/kohana/modules), они великолепны.
Я надеюсь, что этот маленький фрагмент помог.