我在php中使用MVC模型。 控制器正在向模型发送数据,有时它会期待某些东西。 在我编写网页时,我添加了需要模型更多信息的实用程序。它主要使控制器向模型接口传递更多参数。问题是模型接口大多只将这些变量传递给另一个方法,因此参数列表应该在几个地方改变。这显然是不可接受的,应该如何处理? 我认为传递数据数组并不是最好的主意,因为它可以使它无法控制。什么都可以添加任何东西。 目前我正在使用其他解决方案。我创建了一个特殊的类来处理这个。他们中的每一个都来自一个类,包含" getAsArray()"方法。我认为为几乎每个控制器需求创建一个特殊的类是浪费时间和资源所以这是我的问题:这个问题的最佳解决方案是什么?有什么共同点?
控制器
public function addUser(){
$this->load->model("User");
$username = $this->someWayOfGettingData("username");
$email = $this->someWayOfGettingData("email");
$password = $this->someWayOfGettingData("password");
$this->User->insert($username, $email, $password);
}
模型
private function someMethodOperatingOnData($username, $email, $password){
$answer = $this->queryAdd($username, $email, $password);
return $answer;
}
public function insert($username, $email, $password){
return $this->someMethodOperatingOnData($username, $email, $password);
}
问题是什么:当我决定添加有关用户的其他信息(例如性别)时,我必须更新参数列表
insert($username, $email, $password);
someMethodOperatingOnData($username, $email, $password);
queryAdd($username, $email, $password);
为:
insert($username, $email, $password, $gender);
someMethodOperatingOnData($username, $email, $password, $gender);
queryAdd($username, $email, $password, $gender);
所以我必须更新传递这些变量的每个函数。我可以使用数组:
insert($arrayOfData);
someMethodOperatingOnData($arrayOfData);
queryAdd($arrayOfData);
但任何地方都可以添加或删除这些变量,而我也不希望这样做。
答案 0 :(得分:-1)
我可以为此考虑不同的策略:
1)正如您目前所做的那样,创建一个自定义类,使用您的参数对其进行实例化,然后将其传递。但是,由于参数列表不断变化,您的普通旧数据类将成为移动目标,即成本高昂。
2)您可以创建一个字典并将这些参数放入此字典中并传递它。它是OO世界的反模式,但它可能是一个合理的解决方案。
3)在Django世界中,最好的做法之一是完全传递请求。这种方法可以保持方法签名的清晰。与上面的#2相比,这更有利。
我希望它有所帮助。
修改强> 我不是一个PHP人。将字典视为关键值对。在PHP中,数组实际上是键值对。因此,您可以在PHP术语中使用数组,或者在Smalltalk等其他语言中使用词典。所以这个选项仍然有用,虽然我选择的术语不是100%正确,但这个想法或原则仍然是相同的。
以下是第9-2页 Two Scoops of Django 一书的摘录:
对于许多实用程序函数,我们正在使用一个或多个属性 来自django.http.HttpRequest(或简称为HttpRequest)对象和 收集数据或执行操作。我们发现的是 将请求对象本身作为主要参数,我们有 更多方法的简单参数。意味着减少认知过载 管理函数/方法参数:只需传入HttpRequest 对象!
<强> EDIT2 强>
我刚刚看到你对你的问题所做的编辑。所以,从你给出的例子来看,似乎正在发生的事情是你有一个用户类。随着时间的推移,可能需要向用户类添加更多属性。例如,20年前,没有像MobilePhone这样的财产,但现在它几乎是强制性的。因此,最好的方法是将该成员属性添加到User类。使用适当的数据实例化传递User对象,而不是单个用户属性直到您可以实例化用户对象,您可以传递请求对象,如#3中所述,之后,您可以使用用户宾语。我相信这是你最好的路线。
干杯,