YII - Зачем использовать перед сохранением (), если вы можете кодировать перед функцией сохранения ()

Я знаю о функциональности функции beforeSave() в YII, что эта функция используется для выполнения чего-то, что мы хотим выполнить до сохранения наших данных.

Однако, поскольку мы хотим реализовать это до того, как наши данные будут сохранены в базе данных, не можем ли мы напрямую написать этот код до вызова save() (-> save() сохраняет записи в базу данных)

Следовательно, я не уверен, почему именно нам нужно создать определенную функцию, такую ​​​​как beforeSave(), для выполнения действия, которое нам нужно запустить до вызова Save(), когда мы также напрямую пишем этот код перед строкой save().

может кто-нибудь объяснить это? Я много искал по этой причине, но на каждой странице он перенаправляется только на объяснение функции beforeSave().


person CodeWithCoffee    schedule 12.05.2015    source источник


Ответы (2)


Yii и другие фреймворки MVC имеют такие функции.

Хотя вы можете написать свой код «перед сохранением» в контроллере, до функции save() — более рекомендуется и полезно использовать функцию beforeSave().

Причина 1: М в MVC

BeforeSave относится к модели, поэтому было бы логичнее иметь код, который обрабатывает свойства (поля) модели в файле модели, а не иметь этот код в контроллере.

Причина 2: сохранение для вставки и обновления

Вы используете save() при insert новой записи, а также при update существующей записи. Без использования встроенной функции beforeSave вам нужно будет иметь 2 экземпляра вашего «руководства» перед сохранением кода. («Отходы» строк кода)

Причина 3. Сохранение модели с другого контроллера

Что, если вас попросят расширить ваше приложение, и теперь вам придется столкнуться с новым контроллером, который должен сохранить ту же модель (по какой-то причине — просто возможный сценарий) — вам придется скопировать свой «перед сохранением " код к этому контроллеру. А если вы используете встроенную функцию beforeSave, то нет.

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

person Ofir Baruch    schedule 12.05.2015
comment
Спасибо, Офир Барух!! Есть причина использовать перед Сохранить сейчас !! Проголосовал за это - person CodeWithCoffee; 12.05.2015

Простой пример:

У меня есть таблица с двумя полями даты. Каждый раз, когда я пытаюсь выполнить вставку или обновление, мне нужно получить текущую системную дату и выполнить операцию в зависимости от типа операции.

public function beforeSave() {

    if ($this->isNewRecord) {
        $this->insertDate = new CDbExpression('NOW()');
    } else {
        $this->updateDate = new CDbExpression('NOW()');
    }

    return parent::beforeSave();
}

Я написал это один раз, поэтому мне не нужно писать каждый раз, когда я вызываю save() для этого объекта.

Также некоторые базы данных предпочитают другие форматы времени, поэтому вы можете обрабатывать их здесь:

public function beforeSave() {
    $this->date = date('Y-m-d', $this->date);
    return parent::beforeSave();
}
person Ghokun    schedule 12.05.2015
comment
Спасибо !! Таким образом, в основном, где бы пользователь ни написал beforeSave() , он будет вызывать по умолчанию до того, как будет вызвана фактическая функция save() , верно? Как вы привели пример, мы можем вставить/обновить дату, и это нормально, что, если мы хотим добавить/отредактировать какую-то запись, которую мы добавили через форму? возможно ли получить отправленные записи формы в beforeSave? - person CodeWithCoffee; 12.05.2015
comment
Первый вопрос: Да. Во-вторых: возможно и предназначено для получения отправленных записей форм. Вы можете связаться с ними через $this-›attributeName. Как в моем втором примере. Поле даты берется из веб-формы, и в beforeSave() изменяется только формат даты. - person Ghokun; 12.05.2015
comment
Подходит ли yii\behaviors\TimestampBehavior; для этого? - person bumbumpaw; 01.04.2017
comment
@bumbumpaw Похоже, это лучший подход. Я использовал версию 1, отвечая на этот вопрос. Я вижу, что они добавили поведение в версии 2. - person Ghokun; 02.04.2017