humiliation
@humiliation
Чем больше знаю - тем больше дурак

Как правильно загружать изображения в Yii2?

Добрый день!

Собираю уже 3 сайт на Yii, часть функционала уже успешно закопал в компоненты и не дублируюсь, но вот с картинками беда.

Сейчас делаю так:

public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        $currentData = $this->findModel($id);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            $image = UploadedFile::getInstance($model, 'image_name');
            if ($image != null) {
                if ($currentData->image_name)
                    ImagesController::deleteImage($currentData->image_name);
                $model->image_name = ImagesController::saveImage($image);
            } else {
                $model->image_name = $currentData->image_name;
            }
            $model->save();
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('update', [
            'model' => $model,
        ]);
    }

Кому лень читать код:
Получаю данные, беру модель до сохранения, проверяю, есть ли фотка в файл инпуте, если есть - проверяю на старую, удаляю старую, заливаю новую, если нет, но есть уже фотка в бд - ставлю на место старую из модели до сохранения и заливаю обратно.

Вынес всю ответственность за сохранение и удаление в отдельный класс, но все равно приходится во всех моделях дублировать подобный код. Т.к. во-первых, изображение при Update пропадает (не стал делать хидден инпут), а во-вторых, перед обновлением получаю старые данные, которые уже есть в модели (можно заменить на clone - суть не изменится). Считаю все это корявой реализацией, т.к. постоянно везде копирую этот код (ладно если 1 модель с картинкой , а если их 10?)

Как правильно бы централизованно избавиться от этого всего и прекратить подобные извращения? Компонент? Реализовать отдельный роут под изображения?

Подскажите, пожалуйста:3
  • Вопрос задан
  • 261 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы