YiiFramework Yii2 загрузка файлов

Vano

Новичок
http://www.yiiframework.com/doc-2.0/guide-input-file-upload.html вот гайд как это делается. А вопрос: кто-нибудь пробывал не создавать отдельную модель для загрузки файла, а добавить в модель создания юзеров( допустим пользователь при регистрации загружает картинку и аватарку аплоадить в той же моделе что и создает запись в БД ). Правильно ли я считаю, что лучше и красивее валидировать и сохранять картинку и юзера разными моделями?
 

Vano

Новичок
Хотя с другой стороны, на самом верху сложения абстракций, это должна быть одна модель. А так как, прилепить загружаемые файлы не так уж и сложно то можна использовать одну модель.
 

Vano

Новичок
Какраз таки нужна именно одна модель! Чтобы контроллер был тонким и в нем не было такого : If($model->save) ... file->saveAs('uploads/' ... , Используем метод afterSave() в моделе и там уже - только после сохранения записи в БД заливаем картинки.
Вопрос закрыт.
 

peon

Lok'tar ogar
Зависит от проблемы. Если у картинки есть поля, такие как, например, описание, alt, title, то проще делать две модели, так как тебе нужно будет валидирвать эти поля. А одна модель и использование scenarios в этом случае лишь будут усложнять.
 

Sufir

Я не волшебник, я только учусь
А почему, собственно "или"? ООП предоставляет такой мощный инструмент как "включение".
Самому "пользователю" не обязательно, да и не нужно, уметь работать с "аватарками". Не его ответсвенность, его же задачи: $user->getAvatar() и $user->setAvatar().
В то же время "аватар" не является простым скалярным типом. Это тоже некая абстракция представленная отдельной целью, рядом собственных свойств (путь к картинке на сервере, url картинки, может быть тип, размер и т.п.) и методов.
Верхним уровнем абстракции у тебя будет класс представляющий "пользователя", а отдельные ответственности будут реализованы в отдельных собственных классах.
 
Последнее редактирование:

bulat

Новичок
Примерно так получилось, сама картинка сохраняется в папке images с именем time() и это же имя сохраняется в бд
public function actionProfile()
{
$model = $this->findModel(Yii::$app->user->id);
if($model->birthday=='0000-00-00') $model->birthday = NULL;

if ($model->load(Yii::$app->request->post())) {
$model->imageFile = UploadedFile::getInstance($model, 'imageFile');
if ($model->validate()) {
if ($model->imageFile != NULL)
$model->imageFile->saveAs('../images/' . time() . '.' . $model->imageFile->extension);
$model->imageFile = NULL;
$model->imageFile = time();
$model->save(false);
}
}
return $this->render('profile', [
'model' => $model,
]);
}
 
Сверху