良好实践MVC

时间:2014-10-10 21:27:58

标签: php oop database-normalization

假设我有一个包含两个表的数据库:

客户

payment_info

表客户有字段:姓名,地址,payment_info_id

payment_info_id是链接到payment_info中的行的外键。 payment_info有字段:id(链接到payment_info_id),银行,帐号。

由于我的应用程序的逻辑,每次创建客户时,他们的付款信息都存储在payment_info字段的单独行中,该字段链接到客户表中的行。

我正在使用MVC架构。

保持这种“纯粹”并制作两个单独的模型(每个表一个,然后交叉加载它们并从customer_controller中的payment_info_controller调用方法,或者创建一个混合模型,它创建一个客户中的行还会在payment_info中创建一个?

希望这是有道理的!

2 个答案:

答案 0 :(得分:1)

你不应该依靠控制器来做到这一点。将逻辑放在模型中,在服务层后面(如果需要),然后从控制器调用它。

您还应该反转FK设置。将客户ID粘贴在payment_info中,并从客户处删除payment_info_id。这将使客户可以多次付款。

在控制器中:

$user = new User(name, etc...);
$payment = new Payment(payment details...);
$user->applyPayment($paymentInfo);
$userService->save($user)

在服务中:

function save($user){
    //save user and update it with an id)
    $user = $userDal->save($user);
    //now that user has an id, you can generate/save payments.
    $payment->save($user->getPayments());

 }

然后,您可以让userService为用户和付款加载数据访问层。

服务/门面信息:http://www.dofactory.com/net/facade-design-pattern

注意: - 您可能希望提出更好的命名约定,因此很明显,该特定服务将保存/生成付款。例如SaveUserAndPayment($ user)

答案 1 :(得分:-1)

始终保持纯净,你不需要更多未使用的方法来加载,而你也可以从客户那里做东西,而你有一些客户参与并需要得到与之相关的东西,从付款时你做的东西,当你有一些支付参数和需要从中挖掘一些东西。您可以随时使用任何控制器中的支付或客户或任何其他型号,因此请尽可能保持它的纯净和高效;)