Рефакторинг контроллера для модели в коде Igniter - PullRequest
0 голосов
/ 01 февраля 2011

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

У меня естьконтроллер, который обрабатывает загрузку изображения, переименовывает файл и сохраняет его в базе данных, используя 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.

Спасибо за любую помощь заранее

1 Ответ

0 голосов
/ 22 февраля 2011

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

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

Тогда у вас все еще будет некоторое дублирование, но я не вижу другого пути, так как логика контроллера и логика модели в этом случае настолько переплетены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...