Может ли модель работать с массивом _POST и записывать данные в сессию?
в модель должны попадать чистые данные (то есть таки да - -в контроллере)вообще с голым _POST не нужно в 2018 году работать, посмотрите это видео: https://vk.cc/8dAijKвалидацией может заниматься модель, но в данном случае МОДЕЛЬ ВАЛИДАЦИИ, а не модель сущности,  модель -- это целый слой, а не конкретный класс или вид классов, это и сущности и сервисы и валидация и т.д....POST в моделе
Не правильно работать с _POST в моделе, тк модель -- по сути синоним вашего бизнеса, бизнес модель, мне кажется странным было бы, если в магазине были бы продавцы, товары, операции дать денег и  взять сдачу, данные (купюра, скидка)
 и тут же некий _POST запрос  (ну или некая звуковая информация для операций (с битрейтом и частотой:):) мне кажется в бизнес-процесс должно попадать число или купюра, которое обработает некий контроллер (глаз, ухо и продавец в целом как валидатор)Валидация в сеттере
По поводу сеттеров и валидации -- тоже плохо
Купюра должны быть проверена в момент ее передачи, а не когда вы уже дали товар, посчитали сдачу, напечатали чек).. аналогия может быть немного не точной, но понятен принцип -- не в сеттере :)
Ну или как пример -- договор между юрлицами, когда вы договорились и заполняете договор, для подписей (по сути сеттер ваш абстрактный) вы УЖЕ ДОЛЖНЫ были проверить контрагента и условия этого самого договораПольза абстракцийМне кажется так получается гораздо сложнее чем просто в каждом сеттере прописать валидацию. В общем, объясните, пожалуйста, как это реализовать и в чём плюс такого подхода
Если каждый раз писать валидацию, то нужно каждый раз ее писать :)
Если вынести это в отдельную прослойку, то за валидацию будет отвечать отдельный слой, которому вы просто скармливаете поля и их правила -- это упрощает работу с задачей "валидировать" -- вы можете этот слой чинить и усложнять, а сеттеры будут чистыми и не будет копипаста со всеми проблемами -- дублирваоние (забыл, не углядел и прчоее)
Смотрите как валидация делается в Ларавел:public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ];
    }
Модель не должна зависеть от способов ввода/вывода. Она не должна знать ничего о способе предоставления (веб, декстоп, ...) приложения в котором она работает. Сейчас вы хотите, чтобы она обрабатывала HTTP запрос, а завтра вам понадобится предоставить возможность запускать эту же логику командой из консоли, например.