我在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);
但任何地方任何东西都可以添加或删除这些变量,我不希望它发生。
我可以想到不同的策略:
1)正如您目前所做的那样,创建一个自定义类,使用您的参数对其进行实例化,然后将其传递出去。但是,由于参数列表不断变化,您的普通旧数据类将成为移动目标,即成本高昂。
2)您可以创建一个字典并将这些参数放入此字典中并传递它。它是OO世界的反模式,但它可能是一个合理的解决方案。
3)在Django世界中,最好的做法之一是完全传递请求。这种方法可以保持方法签名的清晰。与上面的#2相比,这更有利。
我希望它有所帮助。
编辑我不是一个PHP人。将字典视为关键值对。在PHP中,数组实际上是键值对。因此,您可以在PHP术语中使用数组,或者在Smalltalk等其他语言中使用词典。所以这个选项仍然有效,虽然我选择的术语不是100%正确,但这个想法或原则仍然是相同的。
以下是本书名为Two Scoops of Django第9-2节的摘录:
对于许多实用程序函数,我们从django.http.HttpRequest(或简称HttpRequest)对象获取一个或多个属性,并收集数据或执行操作。我们发现的是通过将请求对象本身作为主要参数,我们在更多方法上有更简单的参数。是指管理函数/方法参数的认知过载:只需传入HttpRequest对象!
Aaditi
我刚刚看到你对你的问题所做的编辑。所以,从你给出的例子来看,似乎正在发生的事情是你有一个用户类。随着时间的推移,可能需要向用户类添加更多属性。例如,20年前,没有像MobilePhone这样的财产,但现在它几乎是强制性的。因此,最好的方法是将该成员属性添加到User类。使用适当的数据实例化它并传递User对象,而不是单个用户属性直到您可以实例化用户对象,您可以传递请求对象,如#3中所述,之后,您可以使用User对象。我相信这是你最好的路线。
干杯,