Типизированные Request и Response
ИМХО, задача реквеста — принять входящие данные (POST/GET/COOKIE и прочие заголовки), инициировать запуск нужного метода контроллера, и вернуть реквест с результатом. Соответственно, вся логика (валидация, запросы к БД и т.д.) должна лежать в контроллере, но не запросе. Request — служебный класс, и его имеет смысл разбивать на подклассы, если возможны различные варианты обработки входящего запроса, но никак не подстраиваться под бизнес-логику.
А еще можно создать для пущей важности BaseRequest и BaseResponse и там чего-нибудь общее прописать, а потом уже от них наследовать Request и Response, ну и так далее. Можно еще для связи этих объектов сочинить еще какой-нибудь класс-посредник, а для пущей важности сделать объектами еще и все параметры, которые может получать Request, а уже в них для каждого прописать валидацию. Ведь это же ООП, не так ли? ;-)