Данные формы, обработанные в контроллере или модели: что лучше? - PullRequest
3 голосов
/ 20 декабря 2011

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

// Controller
// validation etc
$data = array('name'=>$this->input->post('name'), '... etc');
$this->user_model->insert($data);

// Model
function insert($data){
    $this->db->insert('users',$data);
}

или

// Controller
// validation etc
$this->user_model->insert();

// Model
function insert($data){
    $data = array('name'=>$this->input->post('name'), '... etc');
    $this->db->insert('users',$data);
}

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 21 декабря 2011

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

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

Другой вариант, если вам нужно лучшее из обоих миров, создайте в модели функцию-оболочку:

// Controller
// validation etc
$this->user_model->insert_from_post();

// Model
function insert_from_post(){
    $data = array('name'=>$this->input->post('name'), '... etc');
    $this->insert('users',$data);
}

function insert($data){
    $this->db->insert('users',$data);
}

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

0 голосов
/ 20 декабря 2011

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

Codeigniter 2.1 позволяет вам поместить все ваши конфиги form_validation в один файл внутри application / config / form_validation.php

Так что на самом деле все, что нужно вашему контроллеру, это сказать

if ($this->form_validation->run('auth/register')) {/** interact with your models or libraries (keep the  heavy stuff outside **/ )}else{//show form}

Редактировать: @ сом

Поддержание минимума контроллера - это не то же самое, что сказать: «Не кладите ничего в свой контроллер». Если вы заметили выше, я включил проверку формы в контроллер, однако вы можете исключить конфигурацию form_validation из вашего контроллера.

Минимальный контроллер будет выглядеть так.

class someclass extends CI_Controller
{
 //The form validation rules go inside the application/config/form_validation.php
 //and is called automatically once the class/method is init

 public function __construct()
 {
     parent::__construct();
 }

 public function form()
 {
    $this->load->view('templates/public', array('content'=>'form_view.php'));
 }

 public function validate()
 {
      if($this->form_validation->run('someclass/validate'))// optionally pass the config key
      {
          if(Model::method($this->input->post()))
          {
              //do something positive
          }else
          {
             $this->session->set_flashdata('error', $this->lang->line('some_error'));
             redirect('/');
          }
      }else
      {
         $this->form();//show form again
      }
 }

 public function work_with_model()
 {
     $this->load->view('_index', array(
        'model_data'=> model::method()// do all looping, html encoding, time/date parsing etc and only send back a string or an array/object ready for output
     ));
 }

} 

приложение / Config / form_validation.php

$config = array('someclass/validate'=>array(
     array('field'=>'Field', 'label'=>'Label', 'rules'=>'trim|required|xss_clean|serialize')
));

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

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