Говнокод ли? Создаю объект в внутри метода объекта, когда оба имеют одинаковый тип

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
DPRK
Сообщения: 11
Зарегистрирован: 2015.03.09, 14:55

Говнокод ли? Создаю объект в внутри метода объекта, когда оба имеют одинаковый тип

Сообщение DPRK »

Привет. Думается мне, что не совсем верно поступаю в плане дизайна.

В экшене контроллера вызываю метод объекта модели, который создает квери билдер через статичный метод класса (того же типа), возвращающий объект модели. Это нормальная практика? Я тут потихоньку рефакторю свой портотип, всплывают вопросы.

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

//controller

$newsModel = new News();
$oneLastNews = $newsModel->getOneLastNews(); 

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

//model News

public function getOneLastNews()
{
    return News::find()->limit(1)->orderBy('id DESC')->one();
} 
И еще второй вопрос. Метод ActiveQuery::one() производит выборку всех записей (если мы не указали limit в билдере). Но раз этот метод возвращает модель одной записи бд, то почему он за нас не производит limit в запросе?
DPRK
Сообщения: 11
Зарегистрирован: 2015.03.09, 14:55

Re: Говнокод ли? Создаю объект в внутри метода объекта, когда оба имеют одинаковый тип

Сообщение DPRK »

Дополню первый вопрос, если непонятно: теперь каждый новый объект модели имеет метод никак не связанный с внутренним состоянием (то есть производит работу никак не связанную с текущим объектом, который представляет данные). Может этот метод должен быть статичный? Или есть более правильное решение?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Говнокод ли? Создаю объект в внутри метода объекта, когда оба имеют одинаковый тип

Сообщение rak »

зачем такие сложности? почему прямо в контроллере не сделать?

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

$lastNews = News::find()->orderBy('id DESC')->one();
DPRK
Сообщения: 11
Зарегистрирован: 2015.03.09, 14:55

Re: Говнокод ли? Создаю объект в внутри метода объекта, когда оба имеют одинаковый тип

Сообщение DPRK »

rak писал(а):зачем такие сложности? почему прямо в контроллере не сделать?

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

$lastNews = News::find()->orderBy('id DESC')->one();
 

Стараюсь работу с данными реализовывать в качестве интерфейса модели. По мне так, контроллер мост между пользователями и результатом бизнес логики.
Плюс ко всему, клиенту кода понятно, что происходит в этой части кода, судя по имени метода.
И еще использую ... ->limit(1)-> ... в билдере, для того чтобы в результате запроса к бд в выборке была лишь одна запись, что меньше загружает память.
Аватара пользователя
jilizart
Сообщения: 82
Зарегистрирован: 2010.04.22, 18:56
Контактная информация:

Re: Говнокод ли? Создаю объект в внутри метода объекта, когда оба имеют одинаковый тип

Сообщение jilizart »

Советую создать под разные условия класс Query. Например у нас есть модель "NewsPost"
Для него создаем класс "NewsPostQuery"

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

class NewsPostQuery extends ActiveQuery
{
    /**
     * Select sticky posts.
     *
     * @return $this
     */
    public function sticky()
    {
        $this->andWhere([NewsPost::tableName() . '.status_id' => NewsPost::STATUS_STICKY]);

        return $this;
    }

    /**
     * Select posts by views.
     *
     * @param int $number
     * @return $this
     */
    public function views($number = 5)
    {
        $this->andWhere('views > :num', [':num' => $number]);

        return $this;
    }
}
Далее в модели переопределяем метод "::find()"

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

class NewsPost extends ActiveRecord
{

    /**
     * @inheritdoc
     */
    public static function find()
    {
        return new NewsPostQuery(get_called_class());
    }
}
И далее в контроллере уже вызываем

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

NewsPost::find()->sticky()->views(5)->one()
Условий получается множество и их можно комбинировать
Ответить