Где хранить кастомные классы бизнес логики в Yii2 и стоит ли хранить запросы к бд в ее модели?
Всем здравствуйте, подскажите пожалуйста по такому вопросу. Yii2 advanced, допустим есть модель таблицы, находиться в папке frontend/models/Review.php, она описывает одноименную таблицу в бд "review" и наследуется от класса ActiveRecord, таблица содержит набор полей и нам необходимо получить, допустим, все записи по дате. Создаем метод public static function getReviewByData( $data )...который возвращает нам наши записи. Правильно ли делать модель толстой и хранить там всю логику, все методы получения и записи данных, а потом в контроллере вызывать их, либо стоит создать отдельный класс для CRUD-манипуляций и вызывать методы из него, либо вообще ( видел примеры когда создают запросы к бд во view, что считаю в корне неправильным ). И другой вопрос, где в шаблоне advanced хранить бизнес логику (свои классы), какие правильные практики существуют ( естественно чтобы была возможность автозагрузки классов стандартными средствами yii2 ). Допустим я хочу реализовать какой-либо паттерн, мне стоит хранить весь паттерн в каком либо одном namespace или разные классы и интерфейсы в разных namespace...Заранее спасибо за ответ.
таблица содержит набор полей и нам необходимо получить, допустим, все записи по дате. Создаем метод public static function getReviewByData( $data )...который возвращает нам наши записи. Правильно ли делать модель толстой
Вот что по этому поводу говорят доки: www.yiiframework.com/doc-2.0/guide-db-active-recor...
а именно советуют создавать класс ModelQuery унаследованный от ActiveQuery при этом имея класс Model унаследованный от ActiveRecord и при как правило сюда еще добавляется ModelSearch. В доках все лежит в model, но я внутри model создаю подпапки query и search.
Я приблизительно так и делал, но в то же время один из разработчиков yii2 Дмитрий Науменко на своей презентации рекомендует иначе: slides.silverfire.me/2016/gl-yii2-tips/#
santaatnas: Сколько людей столько мнений. По сути все это и так есть. Только к тому что я описал добавьте behavior и/или traits, добавьте helpers и будет то что он описывает. Только это не его метод, это его лопата из-за хорошего знания php и поверхностного знания yii.
Создаем метод public static function getReviewByData( $data )...который возвращает нам наши записи
Ну вообще желательно формирование запросов реализовывать в отдельном классе, наследуемом на пример от ActiveQuery
Правильно ли делать модель толстой и хранить там всю логику, все методы получения и записи данных, а потом в контроллере вызывать их
Не путайте модель в MVC и ActiveRecord в YII. ActiveRecord - просто паттерн реализующий определенный фронт работ с таблицей базы данных, модель же должна содержать бизнес-логику приложения. Соответственно если у Вас есть ActiveRecord - Review, то бизнес-логики в ней лучше не делать, а реализовывать ее отдельными классами, с которыми будет взаимодействовать контроллер
И другой вопрос, где в шаблоне advanced хранить бизнес логику (свои классы), какие правильные практики существуют ( естественно чтобы была возможность автозагрузки классов стандартными средствами yii2 ). Допустим я хочу реализовать какой-либо паттерн, мне стоит хранить весь паттерн в каком либо одном namespace или разные классы и интерфейсы в разных namespace...
Да где хотите, все зависит от архитектуры которую Вы предусматриваете в проекте. Yii не налаживает ни каких ограничений на это.
Я не путаю MVC и ActiveRecord, Active Record - это ORM, a MVC - шаблон проектирования приложения. Вопрос в другом, по чистому MVC - запросы к бд относятся к Model, в ней же и храниться вся бизнес логика (domain logic), в yii2 нас создатели фреймворка убеждают (исходя из презентаций, что я смотрел) , что в модели должны храниться только классы форм и таблиц. Что вынуждает нас выделять еще один слой классов, для взаимодействий с формами, таблицами и соответственно для кастомной бизнес логики. Где их правильнее хранить? Допустим я хочу создать свой класс и засунуть туда все возможные методы для запроса к таблице (CRUD), и потом хочу использовать Create и Read методы во frontend, а Update Delete методы в backend (типа админка). Как мне построить этот класс? Где расположить( в каком namespace)? От чего его наследовать (yii\base\Model)?
santaatnas: Create, Read, Update, Delete это скорее экшины, во фронтенде создавайте в контроллере нужные вам экшины и в бэкенде соответственно. И что вы подразумеваете под "кастомной бизнес логикой?"