2013-02-20 2 views
0

А имеет много контроллеров, где я должен сохранять/создавать новые модели, это выглядит следующим образом:Слишком много параметров для создания модели в контроллере?

public Controller_Test extends Controller_Template { 

    if ($post = $this->request->post()) { 

     $model = ORM::factory('model'); 
     $model->param1 = $post['Param1']; 
     $model->param2 = $post['Param26']; 
     $model->param3 = $post['Param31']; 
     $model->param4 = $post['Param13']; 
     $model->param5 = $post['Param2']; 
     $model->param6 = $post['Param35']; 
     $model->param7 = $post['Param10']; 
     $model->param8 = $post['Param22']; 
     $model->param9 = $post['Param3']; 
     $model->save(); 
    }  

} 

Можно ли объединить (создать метод) Thats сохранит весь массив?

Я знаю о $model->values($post)->create();, но до сих пор не могу понять, как на самом деле он работает, так как вы можете видеть, что у меня есть разные ключи опубликованных параметров, и это можно было бы рассмотреть.

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

+0

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

+0

Таким образом, я могу выбрать метод, например 'Create_Model', с параметрами опубликованного массива или оставить его как есть (хотя мне это не нравится). – Smash

+0

Глядя на [API] (http://kohanaframework.org/3.0/guide/api/Model#__construct), похоже, они действительно оставляют это по вашему усмотрению. Вы можете использовать магические методы PHP и написать общие геттеры/сеттеры и добавить метод «populate()» к вашей базовой модели, имея все остальные модели. Использование '__call' может дать вам немного большую гибкость, когда дело доходит до отображения результатов поля для моделирования свойств. – ficuscr

ответ

0

Что бы вы ни делали, вам нужно сопоставить имена ключей в переменной $_POST для моделирования имен свойств.

$model_post_map = array(
    'param1' => 'Param1', 
    'param2' => 'Param26', 
    'param3' => 'Param31', 
    'param4' => 'Param13', 
    'param5' => 'Param2', 
    'param6' => 'Param35', 
    'param7' => 'Param10', 
    'param8' => 'Param22', 
    'param9' => 'Param3', 
); 
$post_model_map = array_flip($model_post_map); 

function rekey($arr, $map) { 
    $newarr = array(); 
    foreach ($arr as $k => $v) { 
     if (isset($map[$k])) { 
      $newarr[$map[$k]] = $v; 
     } 
    } 
    return $newarr; 
} 
$modeldata = rekey($post, $post_model_map); 
$model->values($modeldata); 

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

Вы также должны использовать второй аргумент $model->values(), чтобы ограничить возможность изменения формы.

Смежные вопросы