Архитектура MVC и работа с файлами

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
delvin
Сообщения: 85
Зарегистрирован: 2009.11.13, 15:29

Архитектура MVC и работа с файлами

Сообщение delvin »

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

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

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

P.S.: Хорошо бы на форуме переименовать кнопку "сохранить" в "черновик". Я ее постоянно нажимаю вместо кнопки "отправить" :)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Архитектура MVC и работа с файлами

Сообщение samdark »

Мысли верные. Файлы = данные.

Кнопку уже убирал… видно, при апдейте затёрлась…
Аватара пользователя
bartersib
Сообщения: 17
Зарегистрирован: 2009.12.16, 12:03
Откуда: Россия, Красноярск
Контактная информация:

Re: Архитектура MVC и работа с файлами

Сообщение bartersib »

Не интересовался кодом Yii которым реализуется "пристегивание" модели к действующему коду в реальном времени, но наверняка в нем что-то делается по умолчанию (наверное в зависимости от родительского класса модели). Тогда вопрос, зачем заставлять фрэйворк что-то делать если не используется наследование классов фрэймворка, а модель создана по принципу "модель работает с данными, а файл фото это данные, значит модели -- быть!"

Но конечно иметь класс для работы с объектами определенного типа это правильно. Тогда использовать модель ради "повторного использования кода" это гуд :roll:
Вопрос скорее религиозный, нежели технический.
Ответ тоже
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: Архитектура MVC и работа с файлами

Сообщение Ozzy »

А что именно подразумевается под обработкой?

Обычно заполнение атрибутов модели в контроллере, а сама обработку уже в модели на правила и тп.
Ну так у меня по крайней мере.
Мой маленький блог - http://dbhelp.ru
Exel
Сообщения: 9
Зарегистрирован: 2009.12.25, 12:00

Re: Архитектура MVC и работа с файлами

Сообщение Exel »

Согласен с тем, что файлы — это данные, соответственно работаем с ними из модели.

Я делал так:
Имеем, например, карточку продукта с картинкой.

в beforeValidate модель создает CUploadedFile.
В beforeSave готовим имя файла (md5+microtime) и стартуем транзакцию, если не было внешней.
В afterSave сохраняем картинку. Если возникли ошибки при сохранении файла, кидаем исключение + откатываем транзакцию, если она была внутренней.

В beforeDelete стартуем транзакцию, если не было внешней
в afterDelete трем картинку. Если что — исключение + откат транзакции, если она была внутренней.

Соответственно модель жестко связана с файлом.

Пара углов, красиво объехать которые, я пока не сумел:
- чтобы заиметь красивое имя файла (исходное имя + id записи для уникальности) нужно сделать два запроса
- если у модели несколько файлов, то откат неудачного сохранения мне видится весьма муторным занятием: например, пара файлов уже успела сохраниться, а на третьем вылезло permission denied — нужно откатить и запись и пару файлов стереть.

Есть идеи, как эту пару моментов реализовать красиво?
Уже начинают посещать мысли о том, чтобы отказаться от жесткой сцепки модели и файлов. Загружать файлы через файл-менеджер или ftp, а при создании продукта просто тыкать в загруженные файлы и сохранять путь к ним, без всяких отслеживаний. Но тут свои минусы. Что думаете?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Архитектура MVC и работа с файлами

Сообщение samdark »

Файлы надо отслеживать. Потом с этими данными намного проще работать.

Вместо id для уникальности можно использовать time(), id пользователя и вообще всё, что угодно.
Аватара пользователя
delvin
Сообщения: 85
Зарегистрирован: 2009.11.13, 15:29

Re: Архитектура MVC и работа с файлами

Сообщение delvin »

Под обработкой я в данном случае подразумеваю то, что у меня может быть загружена как картинка, так и архив.
Далее если картинка одна , то она переименовывается, копируется в нужную дерикторию и на нее создается тумба.
Если это архив, то он предварительно распаковывается и потом указанным выше способом обрабатываются все изображения в нем.

По поводу наследования - у меня модель от CFormModel. Делаю примерно так, как описал Excel. Только в базу мне ничего записывать не надо, по этому никаких транзакций нет.
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: Архитектура MVC и работа с файлами

Сообщение pirrat »

у меня чуть проще, но смысл близкий: обработка в модели.

В одном экшене происходит как создание так и апдейт, по этому, если аватар был установлен, а при апдейте новый не поставлен, то надо оставлять старую запись...

В контроллере:

Код: Выделить всё

        
             $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();
        }
    }

 
Exel
Сообщения: 9
Зарегистрирован: 2009.12.25, 12:00

Re: Архитектура MVC и работа с файлами

Сообщение Exel »

Sam Dark писал(а):Вместо id для уникальности можно использовать time(), id пользователя и вообще всё, что угодно.
Это вопрос эстетства, короче чем id в моем случае ничего не придумалось (some_seo_relevant_image_title_75.jpg — красота :))
Тоже самое, но с time+microtime уже совсем не красиво как-то... id пользователя тоже не обеспечит уникальности.

pirrat, а что будет, если при сохранении аватарки возникнет ошибка? ;)

Да, кстати, и зачем это?

Код: Выделить всё

<input type="hidden" name="User[avatar]" value="<?=$user->avatar?>"/>
Последний раз редактировалось Exel 2009.12.25, 14:39, всего редактировалось 1 раз.
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: Архитектура MVC и работа с файлами

Сообщение pirrat »

Internal Server Error
=)
но вы правы, обработать ошибки стоит!
Exel
Сообщения: 9
Зарегистрирован: 2009.12.25, 12:00

Re: Архитектура MVC и работа с файлами

Сообщение Exel »

pirrat писал(а):Internal Server Error
+
запись в БД со ссылкой на несуществующую картинку
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: Архитектура MVC и работа с файлами

Сообщение pirrat »

Exel писал(а):Да, кстати, и зачем это?

Код: Выделить всё

<input type="hidden" name="User[avatar]" value="<?=$user->avatar?>"/>
это поле для удаления старого аватара , я просто пример упростил, а отображение показал как есть....

в оригинале так:

Код: Выделить всё

            $avatar = CUploadedFile::getInstance($user,'avatar');
            if($avatar!=null) {
                $user->deleteAvatar();
                $user->avatar = $avatar;
            } 
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Архитектура MVC и работа с файлами

Сообщение Ekstazi »

у меня есть behavior который берёт на себя работу с файлами, главное указать куда писать и что
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Архитектура MVC и работа с файлами

Сообщение samdark »

Достаточно универсальный?
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Архитектура MVC и работа с файлами

Сообщение Ekstazi »

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