Сам вопрос задан не "кошерно" ))
Вар.1) логика вашего AfterFind (для отображения) действительно должна быть только в представлении. Т.е. работать с данными в модели удобнее в едином формате(например в том формате в котором вы их получаете из БД) (кроме случаев когда это невозможно).
Вар.2) нахождение логики подготовки данных в BeforeSave немного не кошерно т.к. данные до отображения и после получения будут иметь разный формат. Поэтому предпочтительно эту логику выполнить там где данные были получены(например входящий POST в контроллере)
Вар.3) А для вашего "Хочется "целостности"" - тут "плясать" надо от формата данных с которым вы работаете в модели(опорный формат). В таком случае:
- перед сохранением(для проверки соответствия и преобразования) используете валидацию (см.Автономные валидаторы) или [не так кошерно]beforeSave()
- после получения из БД выполняете преобразование в afterFind()
- для отображения выполняете преобразование в представлениях
- для получения из запроса выполняете преобразование в контроллере
и все эти 4 функции(static) приспокойненько располагаете в базовой модели(или основной, если нет базовой) и дергаете их по мере необходимости.
PS: ответы про сеттеры и геттеры это конечно хорошо, но они как таковые просто инструмент а не решение (для Вар3 можно сделать геттеры(и по необходимости сеттеры) для каждого случая(и соответственно 4 виртуальных атрибута), а можно использовать функции преобразования напрямую)
PPS: товарищ
Максим Федоров, который за форматирование на JS, пишет уж совсем глупые вещи(читайте комментарии про js и общую архитектуру), (ИМХО). Но тут и диссонанс - в других ответах на тостере он вполне себе здраво рассуждает.