Как правильно передавать данные в класс?

254
30 сентября 2017, 23:28

Работаю на Yii2.
Есть модель. Пусть это будет анкета пользователя с множеством различных данных(User).
Есть класс, который в зависимости от данных этой анкеты и формирует, например, размер скидки для пользователя(пусть это будет класс FDiscount).
Вопрос в том как правильно сделать передачу данных в класс?

Я вижу два выхода:

  1. Создаем метод в модели User, например, dataForFDiscount() в котором собираем массив данных, которые потребуются для работы FDiscount. И в дальнейшем передаем массив в конструктор класса FDiscount.
  2. Передаем в FDiscount объект User и уже там разбираемся со всем сразу.

Меня тянет ко второму варианту. Сейчас все работает по первому.

Как будет правильно? Или может быть существует другое решение?

Answer 1

В DDD подходе используется паттерн DTO(Data Transfer Object), суть этого паттерна - создать типизированную структуру для передачи данных.

То есть вы создаете класс, к примеру UserDTO который принимает объект User и берёт только те данные которые вам нужны. И потом вы в своем классе FDiscount принимаете уже UserDTO в котором лежит то что вам нужно. Можете прочитать про этот паттерн и реализовать через него, а так если выбирать из вашего списка - я бы выбрал 2-й вариант.

Answer 2

Я бы не стал делать так, чтобы User знал о FDiscount, а FDiscount о User. Лучше передать в FDiscount просто параметры для формирования, например массив или объект простой.

Если у вас работает метод, в котором надо получить скидку, то в нем получаете User, формируете данные для FDiscount и отдаете в FDiscount.

Answer 3

model, например \app\models\User:

public static function dataForFDiscount($user) {
    //что то делается с юзером проверяются наличие заполненности
    $discount = 0;
    if ($user->emailConfirm) {
       $discount += 5; 
    }
    return $discount;
}

controller, например \app\controllers\User (откуда вызываешь):

public function actionDiscount() {
   ....
   $discount = \app\models\User::dataForFDiscount(Yii::$app->user);
   ....
}

Как то так. Самый простой способ.

READ ALSO
Помогите найти ошибки в коде

Помогите найти ошибки в коде

Где ошибка в коде? В теории код должен работать так чтобы проверять входящие сообщение и отправлять отредактированный ответ исходя из полученногоЕсли...

229
Laravel 5.4. No query results for model при обращении к Route::post-экшену

Laravel 5.4. No query results for model при обращении к Route::post-экшену

Доброго времени сутокДелаю мягкое удаление для ресурса, при переходе в виде по ссылке "Восстановить" (ссылка посылает POST к route('announces

195
php openssl_decrypt Ошибка: digital envelope routines:EVP_DecryptFinal_ex:wrong final block length

php openssl_decrypt Ошибка: digital envelope routines:EVP_DecryptFinal_ex:wrong final block length

Пытаюсь передать зашифрованные данные с одного своего домена на другойВот функция шифрования:

357
PDO execute() подставляет нули вместо переменных

PDO execute() подставляет нули вместо переменных

PDO всё верно подставляет куда требуется

230