5

我必须处理大约 20 个 POST 参数,我不知道在哪里做。

我可以将每个定义为模型上方法的参数,并在调用方法时从控制器传递它们。由于参数的数量,这将导致相当多的工作并使函数调用的可读性降低。

或者我可以调用模型上的方法,直接访问参数。

将参数作为参数传递可以让我更好地控制函数访问哪些参数,并且文档将更加不言自明。但是,如果稍后添加新参数,则必须将它们添加到方法调用的末尾,以免破坏每个现有调用。我想如果它发生几次,这会变得相当混乱,因为这些论点无法在逻辑上进行分组。

如果我访问模型中的参数,则无需将任何参数从控制器传递到模型,从而使方法调用更简洁。但我无法控制访问的参数,因为可以轻松且不受限制地添加或删除它们。这将需要其他开发人员更严格的纪律,我不喜欢依赖这一点,因为迟早有人会“快速(添加|更改|修复)这个真正的快速”。

我不确定该走哪条路。我倾向于只在模型中完成所有操作,因为这样可以更快地编写,似乎更易于维护(没有参数混乱)并且在概念上更适合我对模型的看法。另一方面,我不确定我对模型的看法是否正确,如果我依赖其他开发人员在每次更改后始终更新文档,它是否会以混乱告终。

所以我该怎么做?

4

5 回答 5

1

那么,为什么你不能只接受一个(关联)数组作为模型方法中的参数,然后将整个 $_POST 数组传递给它?至少在我看来,它不会破坏封装。

编辑:如果您不喜欢为此使用关联数组,您还可以使用所谓的“普通旧对象”(仅用于携带数据的对象,如 C 中的结构)。例如,如果这涉及保存提交的注册表单:

class UserData
{
    protected $name;
    protected $username;
    protected $password;

    public function getName() { /* <...> */ }
    public function setName() { /* <...> */ }
    /* other accessors go here */
}

class UserController extends Controller
{
    public function register()
    {
        $userData = UserData::create()
            ->setName($_POST['name'])
            ->setUsername($_POST['username'])
            ->setPassword($_POST['password']);
        Users::add($userData);
    }
}

这将允许您在 Users::add 中使用严格的类型,并使文档过程更容易。

于 2009-08-18T12:15:44.497 回答
1

我一直在为同样的问题苦苦挣扎,我想出的解决方案是灵活的,保持我的代码可重用,并且可以容忍前端的更改:我喜欢使用 setter。当然,为每个值设置一个设置器是一件很痛苦的事情,因此以逻辑方式对数据进行分组有助于:

$user = 新用户();
$user->setName($_POST['lastName'],$_POST['firstName']);
$user->setAddress($_POST['address1'],$_POST['address2'],$_POST['city'],$_POST['state'],$_POST['zip']);

你明白了。一旦保存到对象变量中,您就可以在对象的所有方法中使用这些值。

让你的模型依赖于超全局变量是非常不灵活的。它也使单元测试变得痛苦。

于 2009-08-18T13:38:45.533 回答
0

不久前我回答了一个类似的问题。恕我直言,您应该通过它们,例如已经提议的关联数组(并在之前进行所有安全检查)。这样,您可以轻松地重用您的类。

于 2009-08-18T12:19:05.590 回答
0

控制器。因为请求数据和模型操作不是一回事。因此,所有其他可能的请求都需要将基于请求数据的逻辑放入模型中,这很糟糕

于 2009-08-18T13:29:08.037 回答
0

这就是我要做的...

//Object Oriented POST Replacement
  if ($_SERVER['REQUEST_METHOD'] == 'POST')
  {
      $_POST = json_decode(file_get_contents('php://input'));
  }

我主要编写通过 JSON 传输信息的 API,使用 Content-Type: application/json. 但是,无论如何$_POST填充,这都会起作用(并且在我看来更好)。

不管你在做什么,我建议把$_POST超全局变成一个对象。在您的模型中,接受单个对象作为参数,并提取属性或子属性。

从那里,只需设置您的控制器方法以调用模型方法,并将您的面向对象$_POST的超全局作为唯一参数。

于 2017-01-03T21:57:41.147 回答