2011-02-01 2 views
0

Il est venu à mon attention que mon code de traitement d'image que j'ai actuellement dans mon contrôleur serait mieux adapté dans un modèle, mais je ne suis pas sûr même où commencer à faire cela.Refactoring Contrôleur pour modéliser l'allumeur de code

J'ai un contrôleur qui gère le téléchargement d'une image, renommer le fichier et le stocker dans la base de données en utilisant 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(); 
    } 

} 

Je voudrais être en mesure d'avoir plus de cela dans un modèle, parce que je J'utilise un système de gabarit pour les vues où ma vue uploadimage.php est juste le formulaire de téléchargement afin qu'il puisse être déposé sur n'importe quelle page. Aussi, j'ai seulement de l'expérience en utilisant des modèles Doctrine.

Merci pour toute aide à l'avance

Répondre

0

moi avons eu un problème similaire sur mon propre projet: duplication des contrôleurs. Je pense que dans votre cas, il est logique de ne déplacer que des parties de cette logique dans le modèle, car la plupart d'entre elles ont réellement du sens d'être dans un contrôleur.

La vue de rendu devrait certainement être dans un contrôleur, et la validation d'entrée aussi bien. Je déplacerais la partie transactionnelle vers le modèle: le SQL, la manipulation de fichiers et la manipulation d'images.

Vous aurez encore une certaine duplication, mais je ne vois pas d'autre moyen puisque la logique du contrôleur et la logique du modèle sont si imbriquées dans ce cas.