Большинство людей думают о парадигме «Толстые модели, тощие контроллеры», и в долгосрочной перспективе она работает лучше.
Хорошее правило - думать о своих моделях как о своей собственной сущности, вчувствую, что если вы перенесете свои модели, например, в другую среду, они все равно будут функционировать.
Простым примером будет сохранение информации о заказе на веб-сайте электронной коммерции.Допустим, вы хотите сохранить информацию о налоге, а именно, сколько налога на заказ.Абстрактный способ сделать это ...
$tax_amount = $order_amount * (TAX_PERCENTAGE / 100);
Должны ли мы сделать это в контроллере или модели?Предположим, что мы сделали это в контроллере, ну ... в нашем действии create и в нашем обновлении мы будем рассчитывать налог, что усложнит обслуживание кода и изменится ли бизнес-правила сайта электронной коммерции (скажем, мыначните продавать безналоговому бизнесу или зарубежному бизнесу), тогда нам придется поменять любой контроллер, сохраняющий информацию о заказе.
Однако, если бы мы рассчитывали налог в нашей модели заказа, мы бы сделали это один раз, чтобы сохранить() метод, который вызывается при редактировании и добавлении заказов.
public function save() {
//calculate tax first
$q = $this->db->query($sql);
}
Имо, лучше применять бизнес-правила в вашей модели, потому что он обеспечивает более переносимый код и гораздо меньше головной боли, когда речь идет об обслуживанииваш код.Конечно, есть люди, которые не согласятся, и это очень субъективная область.
РЕДАКТИРОВАТЬ:
Применяя это к конкретному вопросу, который вы задали, подумайте, понадобится ли вам когда-нибудь метод login()
где-нибудь еще, кроме вашей модели User?Возможно, вы захотите разделить свои модели на более конкретные.Но в этом случае вы можете расширить свою модель пользователя.
Как насчет того, чтобы полностью убрать контроллер?Или, если вы хотите взаимодействовать с вашими моделями совершенно по-другому (скажем, через другую платформу в будущем).Думая таким образом, вам было бы гораздо лучше использовать метод входа в вашу модель User.
Лично я бы создал метод входа в систему для моей модели, потому что это операция с данными, и это то, что наши моделидля.Я также хотел бы создать метод loginAction()
на моем контроллере, который будет запускать метод login()
в нашей модели и выполнять любое другое действие (например, журнал неудачных попыток / перенаправление), которое должно произойти напост-логин, должен ли он быть успешным или неудачным.Пример loginAction()
может выглядеть следующим образом ...
class UserController extends GenericController {
public function loginAction() {
$post = $this->form->getPost();
if(UserModel::login($post)) {
//do something
} else {
//do something else
}
}
}