cakePHP上的新手:模块化方法

时间:2011-01-27 10:04:14

标签: php cakephp methods

我正在开发一个类似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方法),非常感谢

2 个答案:

答案 0 :(得分:2)

看起来您可以将此功能作为模型类实现到/models/deal_user.php/models/deal.php,这样您就可以在有需要的控制器之间共享process_deal

当控制器需要它时,只需包含ModelClass。胖子模特。

此外,您不应将此功能包含在app_controller中,因为在所有其他控制器上共享此方法可能没有意义,或者在所有控制器中实例化DealUserDeal模型控制器,有些可能根本不需要它。

如果您在控制器中尝试debug($this),您就会知道阵列有多可怕。你所包含的Model越多,就会越混乱。

<强>更新

(根据个人经验),将您的代码放入以下文件中......

/app/bootstrap.php

  • 当您在应用程序的所有位置共享代码时,如debugjson_encode(当PHP版本<5.2时)等

/app/controllers/components/*.php

  • 当您在控制器之间共享代码/逻辑时,只需要很少的数据库交互。

/app/models/*.php

  • (胖模型)当您在几个控制器之间共享功能时,它们会在保存到数据库之前操纵数据,例如上面的问题。

/app/libs/*.php

  • 当您共享不适合MVC的外部代码时,如TwitterOauth或其他通用类/包,将其转换为组件没有意义,或者太复杂而无法执行此操作。使用App::import('Lib', <name>)将它们导入蛋糕非常充足且整洁。

/app/views/helpers/*.php

  • 当您共享要呈现的HTML代码时,在将数据转换为HTML代码之前需要一些逻辑。

/app/app_controller.php

  • 当您需要在beforeFilterbeforeRender等上进行某些需要在控制器之间具有共同功能的黑客时 。原因是,您的*_controller正在延长app_controller,如果您受到诱惑,然后在{{1}中添加共享componentsuseshelpers希望在所有控制器中都有它们,事实证明你在每个请求中都有重型控制器。养成习惯尽量让你的app_controller变得苗条。在每个控制器中写入更多代码。

app_controller

  • 同样的想法适用于/app/app_model.php

app_controller

  • 当您包含类似外部蛋糕的框架/功能时,或者您可以根据需要将某些框架包装到插件中。

/app/plugins/*/

  • 永远不要把你的代码放在webroot下面!它不整洁,打破了蛋糕的结构,不推荐!这是邪恶的。考虑将代码从Cake转移出来,如果它们不适合Cake。

我认为这就是全部?同样,它们是我在编码体验方面的个人经验。如果您认为不正确,请进行评论/编辑。

答案 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。感谢采用模块化方法。看到它总是令人耳目一新......