Я обратил внимание на то, что мой код обработки изображений, который у меня есть в моем контроллере, лучше подходит для модели, но я не уверен, где начать это делать.
У меня есть контроллер, который обрабатывает загрузку изображения, переименование файла и сохранение его в базе данных с помощью Doctrine:
<?php class Addimage extends Controller { function index() { $vars['content_view'] = 'uploadimage'; $this->load->view('template', $vars); } public function do_upload() { $this->load->library('form_validation'); if($this->_submit_validate() == FALSE) { /*THIS CODE BLOCK IS DUPLICATED FROM MY HOME PAGE CONTROLLER - this is one of the reasons I want to refactor.*/ $vars['recentimages'] = Doctrine_Query::create() ->select('photo_path') ->from('Gif g') ->orderBy('g.created_at DESC') ->limit(12) ->execute(); $vars['title'] = 'Home'; $vars['content_view'] = 'welcome_message'; $this->load->view('template_front', $vars); } else { $basedir = $this->config->item('server_root') . $this->config->item('upload_dir'); //If the directory doesn't already exist, create it. if (!is_dir($basedir)) { mkdir($basedir, 0777); } $config = array( 'allowed_types' => "gif", 'upload_path' => $basedir, 'remove_spaces' => true ); $this->load->library('upload', $config); if(!$this->upload->do_upload()) { $data['error'] = 'There was a problem with the upload'; } else { $image_data = $this->upload->data(); $fileName = $image_data['file_name']; $title = $this->input->post('title'); //Rename File based on how many of that letter //are already in the database $imageCount = Doctrine_Query::create() ->select('COUNT(i.id) as num_images') ->from('Gif i') ->execute(); $imageCount = $imageCount[0]->num_images++; //Rename file based on title and number of images in db. $newFileName = preg_replace('/[^a-zA-Z0-9\s]/', '', $title) . '_' . $imageCount . $image_data['file_ext']; rename($basedir . $fileName, $basedir . $newFileName); $gif = new Gif(); $gif->photo_path = $newFileName; $gif->title = $title; if(Current_User::user()) { $gif->User = Current_User::user(); } else { $gif->User = Doctrine::getTable('User')->findOneById($this->config->item('anonuid')); } $gif->save(); } redirect('/', 'location'); } } private function _submit_validate() { $this->form_validation->set_rules('title', 'Title', 'required'); return $this->form_validation->run(); } }
Я хотел бы иметь большую часть этого в модели, потому что я использую систему шаблонов для представлений, где мое представление uploadimage.php представляет собой только форму загрузки, чтобы ее можно было отбросить на любую страницу. Кроме того, у меня есть опыт использования моделей Doctrine.
Спасибо за любую помощь заранее
У меня была очень похожая проблема в моем собственном проекте: дублирование в контроллерах. Я думаю, что в вашем случае имеет смысл только перемещать части этой логики в модель, потому что большинство из них действительно имеет смысл находиться в контроллере.
Конечно, просмотр рендеринга должен быть в контроллере и проверять входные данные. Я бы переместил транзакционную часть в модель: SQL, обработку файлов и манипуляции с изображениями.
У вас все равно будет некоторое дублирование, но я не вижу другого пути, так как логика логики и логика модели настолько переплетаются в этом случае.