我想在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
,以防它需要嵌套值,但没有运气。
答案 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">
要点是基本上你的问题的解决方案是创建一个宏,我已经提供了一些解决方法,但你需要根据你的特定需求进行改进。