Интернет-магазин. Есть контроллер cart (корзина), есть модели cart и product. Пользователь жмет «добавить в корзину», вызывается действие add контроллера cart, которое вызывает метод addProduct модели cart. В каком месте правильнее выполнять проверку существования и наличия товара (методы модели product)? В контроллере или в моделе (или и там, и там)? При этом надо вывести пользователю информативное сообщение об ошибке.
Все что касается валидации / проверки данных должно уходить в модель. Если же вам нужно проверять, валидная корзина (на верхнем более абстрактном уровне), то выполняйте эту проверку в контроллере.
А насчет различных сообщений — возвращайте из модели различные сообщения в случае неудачи и дальше их обрабатывайте в контроллере, делайте удобные проброски на вьюхи, где уже выводите в зависимости от этого различные наборы красоты :)
> Если же вам нужно проверять, валидная корзина (на верхнем более абстрактном уровне), то выполняйте эту проверку в контроллере.
Не могу с вами согласиться. Гораздо логичнее сделать для этого метод в классе Корзина: в таком случае его можно будет вызывать откуда угодно, а код в контроллере повторно использовать не получится.
Существует подход thin controllers — that models, согласно которому в контроллере нужно, как можно меньше всего выполнять. В идеале чтобы контроллеры не больше 10 строк были.
Т. е. проверять в моделе. А если я захочу выводить разные сообщения (например, «товар не найден» и «товар закончился»), то придется еще возвращать код ошибки (или выкидывать исключения)?
Подождите, ну при добавлении товара в корзину что происходит — он записывается в БД? Это ответственность модели. Может, вы его в сессию записываете? Тогда это контроллеры/хелперы. Если первый случай — модель может отдавать различный код ошибки, да. И в любом случае, в классическом MVC модель НЕ МОЖЕТ напрямую взаимодействовать с view, в качестве прослойки используется контроллер.
Записывается в БД. Но ведь по сути моделе «корзина» все равно, есть товар на складе или его нет. И модель не должна теоритически знать, как пользователю красиво что-то показать (например, предложить альтернативный товар в случае отсутствия текущего).
furyk, по сути метод checkProduct должен находиться в моделе «товар»: product->isAvailable(). Так вот и вопрос, где вызывать этот метод, в моделе или контроллере.