【问题标题】:How to pass $_POST to models in php mvc [duplicate]如何将 $_POST 传递给 php mvc 中的模型 [重复]
【发布时间】:2013-06-22 11:59:19
【问题描述】:

我已经在互联网上寻找答案,但我找不到它,所以我会在这里问。我在站点中有一些表单,我不确定如何将 $_POST 传递给模型,我在这里想到了一些选项:

方法一:

直接从模型访问$_POST,我看到这种方法的问题是,现在我的模型被绑定到我的视图,这使得我的模型不可重用。

方法二:

创建一个包含帖子信息的$data 数组,但是如果我的表单中有 10 个以上的字段,分配所有这些变量是很乏味的,并且在模型中我必须知道我在控制器中命名的键.

方法三:

将每个 $_POST 键作为参数传递给模型函数,但这与方法 2 存在类似的问题,即如果我有 10 多个字段将有很多参数,并且如果我想稍后添加一个新参数需要重写很多代码。

我想知道其他 php 程序员是如何做到这一点的。

【问题讨论】:

  • 我在 MVC 方面没有太多经验,实际上我是新手,但据我所知,您不应该将发布信息传递给控制器​​吗?并将帖子传递给所需的模型,您的模型应该编写得足够好以形成查询,或者您可以制作一个扩展标准模型的特定模型,即使它不可重用,有时它会发生,而不是您的 100%代码必须是可重用的
  • +1 @aleation 所说的,控制器处理 POST,做任何需要的事情(验证,业务逻辑......)并填充模型。模型甚至不应该知道 POST 的存在,它只是 POPO(普通的旧 php 对象)
  • 我将验证保存在模型中。

标签: php model-view-controller


【解决方案1】:

模型是一个。首先,您需要了解模型中发生了什么,您可以阅读here

现在我们已经弄清楚了,让我们来解决您的问题。您希望将数据从视图传递到模型层中的某种服务/数据映射器。这与其他所有请求的处理方式相同

  • 对您的应用程序执行请求
  • 路由句柄将此请求发送到相应的控制器
  • 您可能有某种机制允许 XMLHttpRequests 仅用于某些控制器/方法。如果是这样,您应该在路由周围的某个地方对此进行检查。
  • 您的模型层(可能是验证服务)验证发布数据并确保它是您所期望的。过去,我确保 post 数组中仅存在某些键/值。
  • 将此数据传递给模型中的服务,然后根据您的需要使用它。

基本上,将$_POST 请求视为与任何其他请求相同,只需检查(使用您自己的或框架内置方法)它是您需要的请求类型和内容,然后照常使用。


至于您的“很多字段”,并且您担心代码的可重用性/不必重复自己,请使用循环从客户端获取您需要的数据(也许通过使用 JavaScript 的类)。然后,如果您将来添加更多数据,循环将自动将其拾取并发送给您。

在你的模型中考虑更抽象一点,即它能够处理循环的输入,你就是金子。

【讨论】:

    【解决方案2】:

    不确定其他框架,但在 Yii 中,当您使用模型生成表单时,它使用模型名称和表单元素名称的属性。例如,如果您有一个名为 User 的模型,具有 username、firstname 和 lastname 的属性。它会创建这样的表单:

    <form>
        <input type='text' name='User[username]' id='User_username'>
        <input type='text' name='User[firstname]' id='User_firstname'>
        <input type='text' name='User[lastname]' id='User_lastname'>
        <input type='submit'>
    </form>
    

    这样所有的值都存储在一个数组中。那么你可以简单地说:

    //DONE INSIDE CONTROLLER
    $user = new User();
    $user->attributes = $_POST['User'];
    //or if you need to you can store individual values
    $user->username = $_POST['User']['username'];
    

    如果您没有以这种方式设置模型,您可以轻松地向模型添加一个函数,您可以将 $_POST['User'] 数组发送到并设置值。

    【讨论】:

    • -1:您的 User 实例正在泄漏封装。
    • @tereško 我只是说这是 Yii 框架的工作方式。 OP 询问其他框架如何处理 post 值,这正是我给他的例子。
    • 既然我知道 Yii 有多么可怕,拿它作为例子似乎真的很糟糕。
    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多