我有一张表格:
<form...>
<input type="text" name="Name" />
<input type="text" name="Age" />
</form>
此数据发布到我的控制器:
...
public function PostCreatePerson()
{
$data = Input::all();
// I end up with an array
}
...
现在想象一下,而不是将数组...或数组简单地转换为stdClass ...我想将它转换为自定义对象
...
public function PostCreatePerson()
{
$data = (Person)Input::all();
// I end up with a Person
}
...
问:是否有任何框架将此序列化过程作为一个很好的小功能?还是我不得不自己映射?更具体地说,是否有一个内置于Laravel?
...
public function PostCreatePerson()
{
$person = new Person();
$person->Name = Input::get( "Name" );
$person->Age = Input::get( "Age" );
}
...
这个问题来自这样一个事实:在C#.NET MVC中,表单将其数据发布到控制器,框架将数据序列化为控制器中的对象类型......我非常喜欢这种语法。
...
public void PostCreatePerson( Person person )
{
// person is of type Person and pre-mapped from the form data
}
...
我做了更多的实验......
如果我查看原始发布数据:
$data = file_get_contents("php://input");
看起来像这样:
Name=James&Age=25
如果我查看序列化对象:
$serialized = serialize( new Person() );
它看起来像这样:
O:6:"Person":2:{s:4:"Name";N;s:3:"Age";N;}
如果有一个框架询问控制器方法,你在寻找什么类型?
public function PostCreatePerson( Person $person )
{...
然后说,哦,哈顿...&#34;人&#34;匹配类型&#34; Person&#34;,所以这就是我需要映射的内容。
一旦映射:
O:6:"Person":2:{s:4:"Name";s:5:"James";s:3:"Age";i:25;}
它对它进行反序列化并将其注入到想要它的属性中。
然后您的表单已成功映射到自定义类...
我想知道是否有一个框架或插件可以做到这一点?
我只是想改变序列化字符串以获取值,因为它不会调用Person的构造......也许选择调用或不调用构造也是一个有效的要求?
答案 0 :(得分:1)
您可以通过以下方式一次设置一组参数:
$person = new Person(Input::only('Name','Age'));
要处理mass assignment,您需要定义可填充属性:
class Person extends Eloquent {
protected $fillable = array('Name', 'Age');
}
答案 1 :(得分:0)
您可以随时循环输入并将它们映射到您的模型,如下所示。传递模型的实例将允许您在以下内容中使用它:
public function PostCreatePerson() {
$person = new Person();
$data = Input::only('Name', 'Age');
foreach ($data as $field => $val) {
$person->{$field} = $val;
}
$person->save();
}
显然,在尝试保存之前,您会验证您是否拥有正确的字段。
或者如果你只是意味着将它们分配给一个对象而你总是可以使用:
public function PostCreatePerson() {
$person = new stdClass();
$data = Input::only('Name', 'Age');
foreach ($data as $field => $val) {
$person->{$field} = $val;
}
}
这样您就可以访问以下字段:$ person-&gt; Name