2010-07-01 3 views
1

Позвольте мне предисловие, сказав, что это первый живой проект cakephp для меня.Cakephp Fat Models - следует импортировать компоненты?

Я пытаюсь переместить логику из контроллера в модель, но тот факт, что компоуты недоступны, делает это неудобным.

Например, я хочу отправить уведомление по электронной почте после регистрации пользователя. Я переместил функцию электронной почты в модель, но теперь мне нужно импортировать компонент электронной почты в модель.

Так что для пары строк кода (за исключением строк для самого сообщения) мне нужно импортировать компонент, который уже может быть использован и в контроллере (но не в данном конкретном случае).

Кажется, что торт на самом деле не «устроен» для концепции «Жирная модель»?

ответ

3

Не отправляйте электронные письма с модели! Есть причина, по которой компонент EmailComponent является компонентом, а не поведением. Модели касаются моделирования ваших данных. Отправка электронной почты не имеет никакого отношения к моделированию данных, это взаимодействие с реальным миром, то есть выход, поэтому процесс состоит из компонентов и файлов просмотра.

Если что-то в вашей структуре MVC кажется действительно неудобным и странным, вы, вероятно, ошибаетесь.

+0

А, хорошо, спасибо. – Owen

+0

Так вы, такие методы, как find(), лучше всего размещены в модели? Вы следуете правилу большого пальца? Роб упомянул, логика приложения в контроллере и бизнес-логике в модели? – Owen

+0

@MOFlint Да, 'find' является частью обработки ваших данных, поэтому это функция модели. Все, что внутренне связано с вашими данными, входит в модель, а также, скажем, функцию 'calculateTax'. Все, что перемещает эти данные между моделями и пользователем/представлением, т. Е. Связано с вводом/выводом и «потоком», находится в контроллере. – deceze

2

Концепция «жирная модель» не означает, что весь код должен быть перенесен в модель, так как я уверен, что вы уже знаете. В этом случае команда Cake может сделать аргумент - правильно, я думаю, что отправка электронной почты является функцией приложения , а не бизнес логика. Если вы согласны с этой предпосылкой, любая функция почты или обмена сообщениями принадлежит контроллеру, где доступны компоненты.

Я всегда стараюсь думать об этом так:

Если бы я создать API в моем приложении, я хочу, чтобы повторно использовать все бизнес логики, но мало или ни один из приложение логика. Если кто-то выполняет действие против моего приложения через API, он (как правило, по моему опыту) не несет ответственность моего приложения за отправку электронной почты непосредственно клиенту. S/Он понятия не имеет, что он/она использует мое приложение, так как к нему обращаются через внешний источник. Лучшее решение состоит в том, чтобы выполнить бизнес-логику, а затем, основываясь на ее способности завершить, попросите своего контроллера (логику вашего приложения) отправить электронное письмо.

Это не будет устранять неоднозначность каждого варианта использования, но это помогает в большинстве моих.

+0

Спасибо Роба, полезно подумать с точки зрения бизнес-логики приложений и приложений. – Owen

2

Это ваш первый проект, поэтому не беспокойтесь о том, чтобы слепо следовать «лучшим практикам». Помните, что контроллер существует по какой-то причине - это не просто пустое заполнение бутерброда на пороге.

Как только вы начнете работать, вы можете просмотреть и настроить свое желание и начать понимать, почему вы, возможно, захотите переместить логику в (или из) модели.

В самом широком смысле, модель представляет собой интерфейс приложения с базой данных. На мой взгляд, вывод модели должен представлять собой данные, будь то чистые (из базы данных) или измененные, и ничего больше.

Контроллер делает что-то с данными.

Вид отображает выход контроллера.

+0

Эта ссылка может помочь: http://book.cakephp.org/view/10/Understanding-Model-View-Controller – Leo

Смежные вопросы