Refatorando o controlador para o modelo no Code Igniter

Chegou à minha atenção que meu código de image processing que eu atualmente tenho no meu controlador seria mais adequado em um modelo, mas não tenho certeza mesmo para começar a fazer isso.

Eu tenho um controlador que lida com o upload de uma imagem, renomeando o arquivo e armazenando-o no database usando Doctrine:

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

Gostaria de ter a maior parte disso em um modelo, porque estou usando um sistema de modelo para as visualizações onde minha exibição uploadimage.php é apenas o formulário de upload para que ele possa ser descartado em qualquer página. Além disso, eu só tenho experiência usando modelos de Doutrina.

Agradeço por qualquer ajuda desde já

Eu tive uma questão muito semelhante no meu próprio projeto: duplicação nos controladores. Eu acho que, no seu caso, faz sentido apenas mover partes dessa lógica no modelo, porque a maioria realmente faz sentido estar em um controlador.

A visualização de renderização definitivamente deve estar em um controlador e validação de input também. Eu moviria a parte transacional para o modelo: o SQL, o gerenciamento de arquivos e a manipulação de imagens.

Você ainda terá alguma duplicação, mas não vejo outra maneira, uma vez que a lógica do controlador e a lógica do modelo estão tão entrelaçadas nesse caso.