如何使用Laravel表单模型绑定数组作为名称属性?

时间:2014-08-04 11:02:15

标签: php forms laravel

我想在Laravel中使用表单模型绑定。以下(简化)示例工作正常:

{{ Form::model($user, array('class'=>'form-horizontal')) }}
    {{ Form::token() }}

    {{ Form::label('email', 'Email Address') }}
    {{ Form::text('email') }}
{{ Form::close() }}

但是,我想在name属性中使用数组,这是现在非常标准的。换句话说,将user[email]作为字段名称,以便在后端的一个数组中获取所有表单元素。

模型绑定是否可行?当我使用{{ Form::text('user[email]') }}时,电子邮件无法填写。我尝试在array('user'=>$user)函数中添加Form::model,以防它需要嵌套值,但没有运气。

2 个答案:

答案 0 :(得分:2)

Form::model(array('user' => $user))是正确的解决方案,但不幸的是,表单模型绑定的实现非常糟糕,因为它不容易在嵌套的混合数组和对象集上工作。见https://github.com/laravel/framework/pull/5074

您可以尝试Form::model(array('user' => $user->toArray()))Form::model((object) array('user' => $user))

答案 1 :(得分:1)

你可以做一些这样的事情,假设你有一个$user multiple $types

Form::macro('userTypes', function($user,$types)
{
    foreach ($types as $type) {
        $concat = $user . "_" . $type;
        return '<input type="{$type}" name="{$concat}">';
    }
});

使用您的表单样式自定义输出,甚至可能需要为函数添加更多复杂性。

然后简单地将其称为

$user = "johndoe";
$types = array("email","text");
Form::userTypes($user,$types);

这会导致

<input type="email" name="johndoe_email">
<input type="text" name="johndoe_phone">

如果您想在一行中执行此操作并假设您拥有$user $type ,那么您可以做点什么

Form::macro('userType', function($user,$type)
{
        return '<input type="{$type}" name="{$user[$type]}">';
});

通过电话

$user = [ "mail" => "some_mail_value" ];
Form::userType($user,"mail");

会导致

<input type="mail" name="some_mail_value">

或者您可能喜欢使用单个$ user键值数组的内容:

Form::macro('userType', function($user)
{       
        $keys = array_keys($user);
        foreach ($keys as $key => $value) {
            return '<input type="{$key}" name="{$value}">';
        }
});

通过电话

$user = ["mail" =>  "mail_value" , "text" => "text_value"];
Form::userType($user);

这会导致

<input type="mail" name="mail_value">
<input type="text" name="text_value">

最后我没有找到使用默认表单模型绑定的直接方法,因为它要求字段名称与模型属性相同,但您可以执行一种解决方法

Form::macro('customBind', function($user_model,$type)
{       
    return '<input type={$type} name="user[{$type}]" value="{$user_model->$type}">';
});

然后

$user = new User();
$user->email = "johndoe@gmail.com";

Form::customBind($user,"email");

哪会产生类似

的东西
<input type="email" name="user[email]" value="johndoe@gmail.com">

要点是基本上你的问题的解决方案是创建一个宏,我已经提供了一些解决方法,但你需要根据你的特定需求进行改进。