将表单序列化为自定义对象

时间:2014-11-26 14:57:59

标签: php serialization laravel

我有一张表格:

<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的构造......也许选择调用或不调用构造也是一个有效的要求?

2 个答案:

答案 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