我正在开发一个类似groupon的系统,当系统已经建成大约70%时,我进入了这个项目,它是使用cakePHP构建的,说实话,我对cakePHP一无所知。我偶然发现了这个:
会员买了一笔交易
if(has_enough_account_balance){
if((parameters validated)){
insert into 'deal_user' table
log transaction
update 'deal' table by:
user_count = current user_count + bought deal //to determine whether this deal is tipped or not
if(this deal is tipped){
issue coupon
}
}
}else{
this_user_owed
}
管理员确认特定用户已支付了他/她欠下的交易付款
confirm has_paid
update into 'deal_user' table
log transaction
update 'deal' table by:
user_count = current user_count + bought deal //to determine whether this deal is tipped or not
if(this deal is tipped){
issue coupon
}
现在看到其中两个有共同之处,我正在尝试这样做:
会员买了一笔交易
if(has_enough_account_balance){
if((parameters validated)){
process_deal(parameters)
}
}else{
this_user_owed
}
关于管理员确认:
confirm has_paid
process_deal(parameters)
和process_deal将是:
function process_deal(parameters){
if(isset(deal_id)){
update into 'deal_user' table
}else{
insert into 'deal_user' table
}
log transaction
update 'deal' table by:
user_count = current user_count + bought deal //to determine whether this deal is tipped or not
if(this deal is tipped){
issue coupon
}
}
可以做这样的事情吗?我应该把这个process_deal方法放在哪里是最好的地方,我试着将它放在app_controller类中,但似乎它不会更新表,我不知道为什么它不能更新(我正在使用updateAll方法),非常感谢
答案 0 :(得分:2)
看起来您可以将此功能作为模型类实现到/models/deal_user.php
或/models/deal.php
,这样您就可以在有需要的控制器之间共享process_deal
。
当控制器需要它时,只需包含ModelClass。胖子模特。
此外,您不应将此功能包含在app_controller
中,因为在所有其他控制器上共享此方法可能没有意义,或者在所有控制器中实例化DealUser
和Deal
模型控制器,有些可能根本不需要它。
如果您在控制器中尝试debug($this)
,您就会知道阵列有多可怕。你所包含的Model
越多,就会越混乱。
<强>更新强>
(根据个人经验),将您的代码放入以下文件中......
/app/bootstrap.php
debug
,json_encode
(当PHP版本<5.2时)等 /app/controllers/components/*.php
/app/models/*.php
/app/libs/*.php
TwitterOauth
或其他通用类/包,将其转换为组件没有意义,或者太复杂而无法执行此操作。使用App::import('Lib', <name>)
将它们导入蛋糕非常充足且整洁。 /app/views/helpers/*.php
/app/app_controller.php
beforeFilter
,beforeRender
等上进行某些需要在控制器之间具有共同功能的黑客时 。原因是,您的*_controller
正在延长app_controller
,如果您受到诱惑,然后在{{1}中添加共享components
,uses
,helpers
希望在所有控制器中都有它们,事实证明你在每个请求中都有重型控制器。养成习惯尽量让你的app_controller
变得苗条。在每个控制器中写入更多代码。 app_controller
/app/app_model.php
app_controller
/app/plugins/*/
我认为这就是全部?同样,它们是我在编码体验方面的个人经验。如果您认为不正确,请进行评论/编辑。
答案 1 :(得分:2)
我会选择Lionel Chan的答案。
此外,它可能会帮助您阅读CakePHP documentation。你想要做的事情看起来应该不难,但如果你学习框架并在其中工作而不是仅仅使用你已经知道的东西来解决它,你会有更多的运气。
任何处理某个模型的数据库表的代码都应该放在那个特定的模型类中(Lionel引用的胖模型)。
因此,您可以将process_deal
方法放在Deal
模型中。
然后DealsController
可以像这样访问方法:
$this->Deal->process_deal().
然后,如果两个模型之间存在关系,例如:DealUser hasMany Deal
,您可以在DealUsersController
中的操作中访问该方法,如下所示:
$this->DealUser->Deal->process_deal();
如果模型之间没有关系,您仍然可以在process_deal()
中的操作中调用DealUsersController
方法,如下所示:
$this->loadModel('Deal');
$this->Deal->process_deal();
我希望这有助于指明您正确的方向,但我仍然建议您花一两个小时阅读上面链接的CakePHP文档,因为您可能会找到大部分问题的答案......
P.S。感谢采用模块化方法。看到它总是令人耳目一新......