【发布时间】:2014-11-26 14:57:59
【问题描述】:
我有一个表格:
<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 )
{...
然后说,哦,hangon...“Person”与“Person”类型匹配,所以这就是我需要映射到的内容。
一旦映射:
O:6:"Person":2:{s:4:"Name";s:5:"James";s:3:"Age";i:25;}
它对它进行反序列化并将其注入到需要它的属性中。
那么你的表单已经成功映射到一个自定义类...
我想知道是否有框架或插件可以做到这一点?
我只是玩弄了将序列化字符串更改为具有值的想法,因为这样它就不会调用 Person 的构造......也许选择调用或不调用构造也是一个有效的要求?
【问题讨论】:
-
有什么理由关闭它吗?也许我可以扩展我的问题,尽管我认为我很彻底?
-
序列化后你到底想完成什么?如果您的目的只是将其保存到数据库中,那么 Razors 的答案是正确的。
标签: php serialization laravel