Контроллер. Хотя конечно бывают и модели(тут скорее на более низком уровне) с автоматической проверкой данных, но это все же контроллер.
UPD
Вот хороший пример:
Валидация никнейма, только латиница.
Проверка на латиницу - в контроллере.
Проверка на дубль с уже существующим - в модели, часть бизнес логики.
Я считаю что из-за ошибки в вводе(когда ввели кириллицу) зазря загружать модель, который часто монстр, не нужно. Быстро и просто отсечь в контроллере.
Иван прав в том что структурно это все же модель, но физически в проектах ситуации разные. Я уточню что я больше говорил про отсечение стандартных ситуаций, которые от модели практическине зависят. В целям производительности их можно и выносит в контроллер, опять таки скорее как руками(контроллер) взяли посмотрели и увидели это ключ до вставки в замочну скважину(модель и основная бизнес логика). А ведь глаза в данном случае смотрят на модель(замочная скважина) и выходит они часть модели.
Так что в целом на 100% прав Иван, при проектировании нужно понимать что любая валидация это часть модели, просто иногда кажется что это часть контроллера или даже представления, но то всего лишь интерфейсы оьбращения через контроллер к модели.
Так что валидация это: получили данные, контроллер знает к какой модели их давать, у модели должен быть инструмент валидации, далее он возвращает результат ну и мы решаем что и как.
Я просто поспешил сказав что валидация часть контроллера, но то что она вызывается в контроллере не отменяет того факта что это часть модели.