Идеологически правильное использование моделей в YII2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Идеологически правильное использование моделей в YII2

Сообщение pistol »

Всем привет. Правильно ли я понимаю, что в YII2 базовая модель - это набор атрибутов какой-то сущности и правила валидации для этих атрибутов?

Для различных выборок создается отдельная поисковая модель "searchModel", которая возвращает наборы данных сущностей, каждая сущность в наборе - экземпляр базовой модели?

Так вот, вопрос: является ли идеологически правильным такой метод в поисковой модели:

Код: Выделить всё

    public function getBestProducts($limit = 50)
    {
        return $this->find()->where(['is_best' => 'yes'])->limit($limit)->asArray()->all();
    }
Тоесть метод, который возвращает просто массив данных? Или такие массивы лучше формировать в контроллере?
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Идеологически правильное использование моделей в YII2

Сообщение Neuromance »

Идеологически правильно :lol: будет создать экземпляр класса ActiveQuery, там объявить метод best

Код: Выделить всё

public function best($best = 'yes'){
        return $this->andWhere('is_best = :best', ['best' => $best]);
}

//searchModel
public function getBestProducts($limit = 50)
{
    return self::find()->best()->limit($limit)->asArray()->all();
}
Обычно поисковая модель возвращает dataProvider, а не массив, с ним удобнее работать. Но если вам нужен массив, то возвращайте массив, какая тут к чёрту идеология)
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Идеологически правильное использование моделей в YII2

Сообщение ElisDN »

pistol писал(а):Или такие массивы лучше формировать в контроллере?
В вашем примере к логике относится только where. А limit и asArray - это уже кастомизация.

В Yii2 для таких целей расширяют ActiveQuery:

Код: Выделить всё

class ProductQuery extends ActiveQuery
{
    public function best()
    {
         return $this->andWhere(['is_best' => 'yes']);
    }
}
подменяют:

Код: Выделить всё

class Product extends ActiveRecord
{
    public static function find()
    {
        return new ProductQuery(get_called_class());
    }
}
и используют в том же контроллере:

Код: Выделить всё

Product::find()->best()->limit($limit)->asArray()->all();
То есть идеологочески логика остаётся в модели.
Последний раз редактировалось ElisDN 2015.07.13, 09:48, всего редактировалось 1 раз.
Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Идеологически правильное использование моделей в YII2

Сообщение pistol »

ElisDN, а ProductQuery - это что, где его создавать?
Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Идеологически правильное использование моделей в YII2

Сообщение pistol »

Но если вам нужен массив, то возвращайте массив, какая тут к чёрту идеология)
Оно может быть удобно только до поры до времени. А потом могу столкнуться с тем, что остался у разбитого корыта со своими массивами, когда разные готовые виджеты ждут именно модели нужные или типо того :)
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Идеологически правильное использование моделей в YII2

Сообщение Neuromance »

pistol писал(а):
Но если вам нужен массив, то возвращайте массив, какая тут к чёрту идеология)
Оно может быть удобно только до поры до времени. А потом могу столкнуться с тем, что остался у разбитого корыта со своими массивами, когда разные готовые виджеты ждут именно модели нужные или типо того :)
Тогда делайте так как ElisDN посоветовал. Он, кстати, в методе best пропустил return. Без него вроде не будет работать.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Идеологически правильное использование моделей в YII2

Сообщение ElisDN »

Neuromance писал(а): Он, кстати, в методе best пропустил return.
Исправил. Спасибо!
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Идеологически правильное использование моделей в YII2

Сообщение Neuromance »

pistol писал(а):ElisDN, а ProductQuery - это что, где его создавать?
У меня обычно структура папок с моделями выглядит как-то так:
- models
  • Product
    User
  • - search
    • ProductSearch
      UserSearch
    - query
    • ProductQuery
      UserQuery
    - form
    • ProductForm
      UserForm
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Идеологически правильное использование моделей в YII2

Сообщение ElisDN »

pistol писал(а):ElisDN, а ProductQuery - это что, где его создавать?
Обычный Product::find() возвращает экземпляр класса ActiveQuery, который и содержит методы where, limit, asArray, all и остальные. Мы просто наследуемся от него и добавляем свои методы.
Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Идеологически правильное использование моделей в YII2

Сообщение pistol »

Но ProductQuery - это же не модель, даже если тянуть за уши? Нет ли более идеологически правильного места размещения этого класса, нежели в моделях?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Идеологически правильное использование моделей в YII2

Сообщение ElisDN »

Это запчасть от конкретной модели, без неё самой не используемая. Не вижу проблем.
Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Идеологически правильное использование моделей в YII2

Сообщение pistol »

Это запчасть от конкретной модели, без неё самой не используемая. Не вижу проблем.
Понял. Вижу, комрад Neuromance предложил красивое решение с выносом этих запчастей в подпапки моделей.
Спасибо всем!
ge74d8
Сообщения: 40
Зарегистрирован: 2019.03.11, 16:41

Re: Идеологически правильное использование моделей в YII2

Сообщение ge74d8 »

Добрый день,

Подскажите, пожалуйста, где можно посмотреть более полный пример правильной архитектуры модели описанной в этой теме, может есть какой-то открытый проект на гитхабе?

Спасибо.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Идеологически правильное использование моделей в YII2

Сообщение ElisDN »

ge74d8 писал(а): 2020.08.28, 10:44 Подскажите, пожалуйста, где можно посмотреть более полный пример правильной архитектуры модели описанной в этой теме, может есть какой-то открытый проект на гитхабе?
Правильно все делают по-разному. А некоторые полезные советы есть в докладах:

https://elisdn.ru/blog/110/yiiconf-2017

https://rmcreative.ru/blog/post/retsepty-dlja-yii-2
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Идеологически правильное использование моделей в YII2

Сообщение skynin »

ge74d8 писал(а): 2020.08.28, 10:44 Подскажите, пожалуйста, где можно посмотреть более полный пример правильной архитектуры модели описанной в этой теме, может есть какой-то открытый проект на гитхабе?
из докладов только выбрасывайте "ввёл всех в курс методологии DDD"

У Yii https://ru.wikipedia.org/wiki/ActiveRecord
И идеологически неверно использовать DDD на чуждом для этого фреймворке
Как и лезть в само DDD не разобравшись с основами. Она выстреливает на крупных проектах. Врядли собственный учебный проект - крупный, на пару лет разработки :)
Частично - можно и полезно. Но после освоения основ.
Проверка же основ - простая. Берете тех задание учебного курса - "сделать сайт продажи компакт дисков" - с нуля делаете, выкладываете исходники в репо (гитлаб, гитхаб, битбакет - где понравится), разворачиваете на бесплатном хостинге.

Как и в саму архитектуру. Слово звучит конечно круто, только оно предназначено для программистов с опытом работы.
Это примерно как разница в освоении ин языка
вам говорить, слушать, читать писать или вы филологом решили стать?

И точно, ни на какую архитектуру нет смысла тратить время, если
Не прочитан наполовину https://getjump.github.io/ru-php-the-right-way/
Не прочитан Yii Guide
Не листались всякие статьи "Шаблоны проектирования PHP"

Архитектура, по мнению Фаулера - это застывший дизайн. (Вернее не его, он писал что услышал это меткое от другого "Архитектура это решения по дизайну которые очень сложно, почти невозможно изменить впоследствии")
Мне же другое нравится:
Архитектура - это стратегические правила, принципы, соглашения выбора дизайна решений. Нередко - неписанные правила, а являющиеся традицей, духом команды.

Вобщем начинающему "архитектура" - бесполезна. Она для "филологов"

А вот паттерны ООП - да, нужно понимать. Не знать, и применять как попало, а понимать - зачем, к чему, и опознавать их в коде других.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Идеологически правильное использование моделей в YII2

Сообщение skynin »

pistol писал(а): 2015.07.13, 09:17 Правильно ли я понимаю, что в YII2 базовая модель - это набор атрибутов какой-то сущности и правила валидации для этих атрибутов?
И так и не так.

Сам samdark отмечал что сожалеет что выбрали слово model.

У Yii model - это ActiveRcord, ОО обвязка вокруг строки таблицы базы данных. В простых случаях - одна строка в БД - это персистентные данные одной сущности, и тогда да,
модель - это набор атрибутов какой-то сущности и правила валидации для этих атрибутов

Но как только сущность состоит из нескольких строк, или проверка атрибутов требует обращения к другим AR, или нам при сохранении "почему-то" нужно изменять и сохранять другие "модели" - вот тут стоп:
модель у Yii - это набор атрибутов таблицы БД и правила валидации для этих атрибутов

то есть для создания модели сложной сущности - у Yii нет явного инструмента, и такую модель нужно создавать самому, а внутри нее, настоящей модели она работает с персистентыми данными используя другие, низкоуровневые модели Yii2

Но так как в малых и даже средних проектах отличия строчки БД от данных сущности нет, то можно считать что
модель в Yii- это набор атрибутов какой-то сущности и правила валидации для этих атрибутов

Если же академически правильно - то у Yii нет моделей из паттерна MVC
у него ARVC
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
SaintRu
Сообщения: 88
Зарегистрирован: 2020.05.13, 11:22
Контактная информация:

Re: Идеологически правильное использование моделей в YII2

Сообщение SaintRu »

ge74d8 писал(а): 2020.08.28, 10:44 Добрый день,

Подскажите, пожалуйста, где можно посмотреть более полный пример правильной архитектуры модели описанной в этой теме, может есть какой-то открытый проект на гитхабе?

Спасибо.
Посмотри курс ElisDN по Yii2 (shop), там все это есть
Мой старт-ап ;) https://website39.site
ge74d8
Сообщения: 40
Зарегистрирован: 2019.03.11, 16:41

Re: Идеологически правильное использование моделей в YII2

Сообщение ge74d8 »

Вот тут еще много интересного нашел

https://slides.silverfire.me/

Всем кто откликнутся спасибо!
Ответить