【问题标题】:PHP form post, automatically mapping to an object (model binding)PHP表单发布,自动映射到对象(模型绑定)
【发布时间】:2010-06-02 14:10:57
【问题描述】:

我做了很多 ASP.NET MVC 2 开发,但我正在处理一个工作中的小项目,它需要在 PHP 中完成。

PHP 中是否有任何内置功能可以进行模型绑定、将表单发布字段映射到类?我的一些 PHP 代码目前看起来像这样:

class EntryForm
{
    public $FirstName = "";
    public $LastName = "";
}

    $EntryForm = new EntryForm();

if ($_POST && $_POST["Submit"] == "Submit")
{
    $EntryForm->FirstName = trim($_POST["FirstName"]);
    $EntryForm->LastName = trim($_POST["LastName"]);
}

在典型的 PHP 安装中是否有任何内置功能可以像在 ASP.NET MVC 中那样进行此类映射,还是需要额外的框架?

【问题讨论】:

    标签: php model-view-controller


    【解决方案1】:

    不是原生的,而是一个更好的解决方案,允许您使用自己的类或标准类......

    function populateWithPost ($obj = NULL)
    {
      if(is_object($obj)) {
    
      } else {
          $obj = new StdClass ();
      }
    
      foreach ($_POST as $var => $value) {
          $obj->$var = trim($value); //here you can add a filter, like htmlentities ...
      }
    
      return $obj;
    }
    

    然后你可以像这样使用它:

    class EntryForm
    {
        public $FirstName = "";
        public $LastName = "";
    }
    
    $entry = populateWithPost(new EntryForm());
    

     $obj = populateWithPost();
    

    【讨论】:

    • 谢谢!一个小小的改变,它就完美地工作了。 foreach ($_POST as $key => $value) { $obj->$key = trim($value); }
    • 旧线程但$obj->$var = trim($value); 也可以替换为$model->$var = $this->input->post($var);
    • 我使用第二个参数来传递$data。然后,$_POST$_GET 甚至数据库$row 都可以作为参数传递并映射到对象。
    【解决方案2】:

    内置到 PHP 中?没有。

    你暗示的框架答案是你需要去哪里(毕竟,ASP.NET 也是一个框架)

    【讨论】:

    • 旧帖子,我知道,但只是澄清一下.... ASP .NET 不是框架。 .NET 是一个框架。
    • @devlincarnate ASP.NET 确实是一个框架。引用自 ASP.NET 官网,“ASP.NET 是一个用于构建现代 Web 应用程序的开源 Web 框架......” [ASP.NET 网站] (asp.net)
    【解决方案3】:

    您正在寻找的是 ORM(对象关系映射)层。 PHP 有一对,其中之一是Doctrine。也就是说,mahomedalidp 的答案对于用 PHP 完成工作非常方便。

    【讨论】:

      【解决方案4】:

      PHP 没有为此内置任何内容。但很容易在您的 EntryForm 类中实现。您可以将 public function populate($post) 添加到 EntryForm 并将其传递给 $_POST 变量。它会循环,如果类属性存在,设置它。实际上,您可以构建一个实现populate() 的抽象类,并使用您的EntryForm 或您想要的任何其他形式对其进行扩展。当然,您还需要清理输入。

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 1970-01-01
        • 2017-10-16
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多