每个模型,类似的代码 - 更好的方法?(CakePHP的)

Dav*_*ave 3 php cakephp cakephp-2.1 cakephp-model

在几乎每个模型中,我最终编写的代码类似于下面的示例代码.它检查是否类似的选项limit,order,conditions...等发送并基于该查询.

看起来似乎必须有更好的方法,因为大多数这些东西在许多模型中一遍又一遍地重复.也许我可以使用一种行为?或者也许是其他我完全忽略的东西?

就模型代码而言,我觉得我已经尝试重新发明轮子,但我真的想知道轮子是什么 - 即大多数人如何管理他们的模型代码?我认为模特的"正常"是这样的?寻找这种整体"类似模型代码"概念的最佳实践.

//Restaurant model
function getRestaurants($opts = null) {

    //initialize
    $findType = 'all';
    $params['conditions'] = array();    

    //order
    $params['order'] = 'Restaurant.name ASC';
    if(!empty($opts['order'])) $params['order'] = $opts['order'];

    //limit
    if(!empty($opts['limit'])) {
        $params['limit'] = $opts['limit'];
        if($params['limit'] == 1) $findType = 'first';
    }

    /*... ETC ETC
    - can pass conditions, pricing, days open....etc
    - obviously some things are only for this model, but things like
      limit, order, conditions...etc are for all my models
    */

    //pagination
    $paginate = false;
    if(isset($opts['paginate'])) {
        if($opts['paginate']) {
            $paginate = true;
        }
    }

    //either return the paginate options just created
    if($paginate) {
        return $params;

    //or return the restaurant data found
    } else {
        $data = $this->find($findType, $params);
        return $data;
    }
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,还有更复杂的事情 - 无论是否根据发送的选项包含/加入某些模型等等.

我正在努力坚持使用MVC概念并将所有数据库内容保留在模型中.

bur*_*zum 5

如果所有模型的代码相同,则可以使用行为并将其附加到模型并使用beforeFind()回调更改查询.

将代码放入AppModel也很好,并在需要它的模型的beforeFilter()中调用它.但我认为行为输入的工作量较少.;)所以我会去做这个行为.如果您需要更多类似于模型的特定选项而具有一组默认值,则可以通过将模型属性中的选项与行为中的默认值合并来简单地更改行为以支持该行为.如果你更具体,我可以提供更好的解决方案.

最后:没有共同的或100%正确的方法来做到这一点.我总是选择接近MVC并遵循KIS的解决方案.