F21*_*F21 5 php model-view-controller orm crud models
使用MVC模式实现模型时,我的模型应该有多复杂?
假设我有几个这样的表:
我有一个名为UserController的控制器.该控制器应该允许我登录用户,创建用户等.
<!-- language: php -->
class UserController{
public function create($array){
...
}
public function login($email, $password){
...
}
}
Run Code Online (Sandbox Code Playgroud)
我的模型应该非常原始,只通过ORM实现CRUD操作吗?这将导致代码如下:
<!-- language: php -->
class UserController{
public function create($array){
$userModel->username = 'blah';
$userModel->blah = 'blah';
$id = $userModel->save();
$emailModel->id = $id;
$emailModel->email = "emailhere";
$emailModel->save();
//Do the same for addresses
}
public function login($email, $password){
...
}
}
Run Code Online (Sandbox Code Playgroud)
或者,或者,我可以使用更复杂的模型:
<!-- language: php -->
UserModel{
public function login($email, $password){
//Do the joining and checking here, then return true or false to the controller
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器中:
<!-- language: php -->
userModel->login($mail, $password);
Run Code Online (Sandbox Code Playgroud)
那么,哪种方式更好?将所有逻辑填充到模型中,还是应该让模型只进行基本的CRUD操作?最后,我如何处理表连接?它们应该在模型内还是在控制器中处理?
干杯
大多数人会想到“胖模型,瘦控制器”范例,从长远来看它效果更好。
一个很好的经验法则是将模型视为它们自己的实体,例如,如果您将模型移动到不同的框架,它们仍然可以正常工作。
一个简单的例子是保存有关电子商务网站上的订单的信息。假设您想要保存有关税费的信息,即订单上的税费是多少。执行此操作的一种抽象方法是......
$tax_amount = $order_amount * (TAX_PERCENTAGE / 100);
我们应该在控制器还是模型中执行此操作?假设我们在控制器中执行此操作,那么......在我们的创建操作和更新操作中,我们将计算税收,这使得维护代码变得更加困难,并且如果电子商务网站的业务规则发生变化(例如,我们开始向免税企业或海外企业销售),那么我们将不得不更改任何保存订单信息的控制器。
然而,如果我们要在订单模型中计算税金,我们将在 save() 方法中执行一次,该方法将在编辑和添加订单时调用。
public function save() {
//calculate tax first
$q = $this->db->query($sql);
}
Run Code Online (Sandbox Code Playgroud)
在我看来,最好在模型中强制执行业务规则,因为它可以使代码更可移植,并且在维护代码时减少麻烦。当然,有人会不同意,这是一个非常主观的领域。
编辑:
将其应用于您提出的具体问题,想一想login()除了您的用户模型之外,您是否在其他任何地方都需要该方法?您可能希望将模型拆分为不同的、更具体的模型。但在这种情况下,您可以从您的用户模型进行扩展。
如果你完全拿走你的控制器怎么办?或者,如果您想以完全不同的方式与模型交互(比如将来通过不同的框架)。以这种方式思考,您的用户模型中的登录方法会更好。
就我个人而言,我会在我的模型上创建一个登录方法,因为它是对数据的操作,而这正是我们模型的用途。我还将loginAction()在我的控制器上创建一个方法,该方法将login()在我们的模型上启动该方法,并执行登录后必须发生的任何其他操作(例如,记录失败的尝试/重定向),无论成功还是不成功。一个例子loginAction()可能如下所示......
class UserController extends GenericController {
public function loginAction() {
$post = $this->form->getPost();
if(UserModel::login($post)) {
//do something
} else {
//do something else
}
}
}
Run Code Online (Sandbox Code Playgroud)