Архитектура MVC и работа с файлами
Архитектура MVC и работа с файлами
Вопрос скорее религиозный, нежели технический.
Куда логичнее выносить обработку загруженных файлов: в модель или в контроллер
Я делаю так:
- из формы загружается файл: фото или архив фотографий.
- в контроллере полученный файл передается в модель
- в модели обрабатывается либо одна фотография, либо распаковывается архив и обрабатываются все фотографии архива
Правильно ли это с точки зрения архитектуры или логичнее было бы выносить все это в контроллер?
По идее модель предназначена для работы с данными, а этом случае файлы - и есть данные.
P.S.: Хорошо бы на форуме переименовать кнопку "сохранить" в "черновик". Я ее постоянно нажимаю вместо кнопки "отправить"
Куда логичнее выносить обработку загруженных файлов: в модель или в контроллер
Я делаю так:
- из формы загружается файл: фото или архив фотографий.
- в контроллере полученный файл передается в модель
- в модели обрабатывается либо одна фотография, либо распаковывается архив и обрабатываются все фотографии архива
Правильно ли это с точки зрения архитектуры или логичнее было бы выносить все это в контроллер?
По идее модель предназначена для работы с данными, а этом случае файлы - и есть данные.
P.S.: Хорошо бы на форуме переименовать кнопку "сохранить" в "черновик". Я ее постоянно нажимаю вместо кнопки "отправить"
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Архитектура MVC и работа с файлами
Мысли верные. Файлы = данные.
Кнопку уже убирал… видно, при апдейте затёрлась…
Кнопку уже убирал… видно, при апдейте затёрлась…
Нравится Yii? Давайте сделаем его лучше!.
- bartersib
- Сообщения: 17
- Зарегистрирован: 2009.12.16, 12:03
- Откуда: Россия, Красноярск
- Контактная информация:
Re: Архитектура MVC и работа с файлами
Не интересовался кодом Yii которым реализуется "пристегивание" модели к действующему коду в реальном времени, но наверняка в нем что-то делается по умолчанию (наверное в зависимости от родительского класса модели). Тогда вопрос, зачем заставлять фрэйворк что-то делать если не используется наследование классов фрэймворка, а модель создана по принципу "модель работает с данными, а файл фото это данные, значит модели -- быть!"
Но конечно иметь класс для работы с объектами определенного типа это правильно. Тогда использовать модель ради "повторного использования кода" это гуд
Но конечно иметь класс для работы с объектами определенного типа это правильно. Тогда использовать модель ради "повторного использования кода" это гуд
Ответ тожеВопрос скорее религиозный, нежели технический.
Re: Архитектура MVC и работа с файлами
А что именно подразумевается под обработкой?
Обычно заполнение атрибутов модели в контроллере, а сама обработку уже в модели на правила и тп.
Ну так у меня по крайней мере.
Обычно заполнение атрибутов модели в контроллере, а сама обработку уже в модели на правила и тп.
Ну так у меня по крайней мере.
Мой маленький блог - http://dbhelp.ru
Re: Архитектура MVC и работа с файлами
Согласен с тем, что файлы — это данные, соответственно работаем с ними из модели.
Я делал так:
Имеем, например, карточку продукта с картинкой.
в beforeValidate модель создает CUploadedFile.
В beforeSave готовим имя файла (md5+microtime) и стартуем транзакцию, если не было внешней.
В afterSave сохраняем картинку. Если возникли ошибки при сохранении файла, кидаем исключение + откатываем транзакцию, если она была внутренней.
В beforeDelete стартуем транзакцию, если не было внешней
в afterDelete трем картинку. Если что — исключение + откат транзакции, если она была внутренней.
Соответственно модель жестко связана с файлом.
Пара углов, красиво объехать которые, я пока не сумел:
- чтобы заиметь красивое имя файла (исходное имя + id записи для уникальности) нужно сделать два запроса
- если у модели несколько файлов, то откат неудачного сохранения мне видится весьма муторным занятием: например, пара файлов уже успела сохраниться, а на третьем вылезло permission denied — нужно откатить и запись и пару файлов стереть.
Есть идеи, как эту пару моментов реализовать красиво?
Уже начинают посещать мысли о том, чтобы отказаться от жесткой сцепки модели и файлов. Загружать файлы через файл-менеджер или ftp, а при создании продукта просто тыкать в загруженные файлы и сохранять путь к ним, без всяких отслеживаний. Но тут свои минусы. Что думаете?
Я делал так:
Имеем, например, карточку продукта с картинкой.
в beforeValidate модель создает CUploadedFile.
В beforeSave готовим имя файла (md5+microtime) и стартуем транзакцию, если не было внешней.
В afterSave сохраняем картинку. Если возникли ошибки при сохранении файла, кидаем исключение + откатываем транзакцию, если она была внутренней.
В beforeDelete стартуем транзакцию, если не было внешней
в afterDelete трем картинку. Если что — исключение + откат транзакции, если она была внутренней.
Соответственно модель жестко связана с файлом.
Пара углов, красиво объехать которые, я пока не сумел:
- чтобы заиметь красивое имя файла (исходное имя + id записи для уникальности) нужно сделать два запроса
- если у модели несколько файлов, то откат неудачного сохранения мне видится весьма муторным занятием: например, пара файлов уже успела сохраниться, а на третьем вылезло permission denied — нужно откатить и запись и пару файлов стереть.
Есть идеи, как эту пару моментов реализовать красиво?
Уже начинают посещать мысли о том, чтобы отказаться от жесткой сцепки модели и файлов. Загружать файлы через файл-менеджер или ftp, а при создании продукта просто тыкать в загруженные файлы и сохранять путь к ним, без всяких отслеживаний. Но тут свои минусы. Что думаете?
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Архитектура MVC и работа с файлами
Файлы надо отслеживать. Потом с этими данными намного проще работать.
Вместо id для уникальности можно использовать time(), id пользователя и вообще всё, что угодно.
Вместо id для уникальности можно использовать time(), id пользователя и вообще всё, что угодно.
Нравится Yii? Давайте сделаем его лучше!.
Re: Архитектура MVC и работа с файлами
Под обработкой я в данном случае подразумеваю то, что у меня может быть загружена как картинка, так и архив.
Далее если картинка одна , то она переименовывается, копируется в нужную дерикторию и на нее создается тумба.
Если это архив, то он предварительно распаковывается и потом указанным выше способом обрабатываются все изображения в нем.
По поводу наследования - у меня модель от CFormModel. Делаю примерно так, как описал Excel. Только в базу мне ничего записывать не надо, по этому никаких транзакций нет.
Далее если картинка одна , то она переименовывается, копируется в нужную дерикторию и на нее создается тумба.
Если это архив, то он предварительно распаковывается и потом указанным выше способом обрабатываются все изображения в нем.
По поводу наследования - у меня модель от CFormModel. Делаю примерно так, как описал Excel. Только в базу мне ничего записывать не надо, по этому никаких транзакций нет.
Re: Архитектура MVC и работа с файлами
у меня чуть проще, но смысл близкий: обработка в модели.
В одном экшене происходит как создание так и апдейт, по этому, если аватар был установлен, а при апдейте новый не поставлен, то надо оставлять старую запись...
В контроллере:
в отображении
в модели
В одном экшене происходит как создание так и апдейт, по этому, если аватар был установлен, а при апдейте новый не поставлен, то надо оставлять старую запись...
В контроллере:
Код: Выделить всё
$user->attributes=$_POST['User'];
$avatar = CUploadedFile::getInstance($user,'avatar');
if($avatar!=null) $user->avatar = $avatar;
if($user->save()) { //сохраняем если валидно
........
Код: Выделить всё
<input type="hidden" name="User[avatar]" value="<?=$user->avatar?>"/>
<input id="User_avatar" type="file" name="User[avatar]"/>
Код: Выделить всё
public function rules()
{
....
array('avatar', 'file', 'types'=>'jpg, gif, png', 'maxSize' => 1048576,'allowEmpty'=>true),
}
public function afterSave() {
....
$this->saveAvatar();
}
public function saveAvatar()
{
if(!($this->avatar instanceof CUploadedFile))
return;
$avatar_location = './public/avatars/'.$this->id.'-'.$this->avatar;
$this->avatar->saveAs($avatar_location);
$image = Yii::app()->image->load($avatar_location);
if($image->width > 80) {
$image->resize(80, null, Image::AUTO);
$image->crop(80, 80, $top = 'top', $left = 'left');
$image->save();
}
}
Re: Архитектура MVC и работа с файлами
Это вопрос эстетства, короче чем id в моем случае ничего не придумалось (some_seo_relevant_image_title_75.jpg — красота )Sam Dark писал(а):Вместо id для уникальности можно использовать time(), id пользователя и вообще всё, что угодно.
Тоже самое, но с time+microtime уже совсем не красиво как-то... id пользователя тоже не обеспечит уникальности.
pirrat, а что будет, если при сохранении аватарки возникнет ошибка?
Да, кстати, и зачем это?
Код: Выделить всё
<input type="hidden" name="User[avatar]" value="<?=$user->avatar?>"/>
Последний раз редактировалось Exel 2009.12.25, 14:39, всего редактировалось 1 раз.
Re: Архитектура MVC и работа с файлами
=)Internal Server Error
но вы правы, обработать ошибки стоит!
Re: Архитектура MVC и работа с файлами
+pirrat писал(а):Internal Server Error
запись в БД со ссылкой на несуществующую картинку
Re: Архитектура MVC и работа с файлами
это поле для удаления старого аватара , я просто пример упростил, а отображение показал как есть....Exel писал(а):Да, кстати, и зачем это?Код: Выделить всё
<input type="hidden" name="User[avatar]" value="<?=$user->avatar?>"/>
в оригинале так:
Код: Выделить всё
$avatar = CUploadedFile::getInstance($user,'avatar');
if($avatar!=null) {
$user->deleteAvatar();
$user->avatar = $avatar;
}
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: Архитектура MVC и работа с файлами
у меня есть behavior который берёт на себя работу с файлами, главное указать куда писать и что
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Архитектура MVC и работа с файлами
Достаточно универсальный?
Нравится Yii? Давайте сделаем его лучше!.
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: Архитектура MVC и работа с файлами
Ну там параметром удалять ли старый файл, в какую папку сохранять, помнить ли пред. файл, и какой путь к файлу в бд писать. Пока хватает, но времени пока мало чтоб привести в нужную форму его.