控制器中用于创建模型的参数太多


Too many parameters for model creation in controller?

A有很多控制器,我必须在其中保存/创建新模型,它看起来像这样:

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

有可能统一(创建一个方法)来保存所有数组吗?

我知道$model->values($post)->create();,但仍然无法理解它的工作原理,因为你可以看到我有不同的已发布参数键,这可能会被考虑。

在许多例子中,所有的数据赋值都发生在控制器中,但它们真的很小,在我的情况下,我假设有一个巨大的控制器,有很多数据赋值字符串,我认为这将是一种糟糕的编码风格。

无论您需要什么,都可以将$_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()的第二个参数来限制窗体可以更改的内容。