【问题标题】:Serializing forms into custom objects将表单序列化为自定义对象
【发布时间】: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


【解决方案1】:

您可以通过以下方式一次设置一堆参数:

$person = new Person(Input::only('Name','Age'));

处理mass assignment,需要定义可填充属性:

class Person extends Eloquent {

    protected $fillable = array('Name', 'Age');

}

【讨论】:

  • 我喜欢这个,因为你也可以保留你的构造。
【解决方案2】:

您总是可以循环遍历您的输入并将它们映射到您的模型,如下所示。传递模型的实例将允许您在以下范围内使用它:

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->Name

【讨论】:

  • Person $person 来自哪里?它不是从表单神奇地发布到这个参数中......它会说,$person 是 Person 类型的预期实例,没有给出......但是,是的循环将映射对象很好,我想知道是否有 Laravel框架或类似的东西会为我做这件事,你遇到的所有细节问题都已经整理好了。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 2018-05-09
  • 2011-01-13
  • 1970-01-01
  • 2014-05-02
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多