指导努力使瘦控制器和脂肪模型在CakePHP中(Guidance trying to make sk

2019-10-16 15:53发布

我是新来的蛋糕,并MVC的一般。 我想从一开始去建立良好的生活习惯。 在这些良好的生活习惯是保持控制器瘦,使得模型的脂肪。 但它是像我这样的小白有点运动目标。 如果我需要从一个模型传递信息到另一个,我只是倾倒所有到控制器? 尽量做到在一个模型?

这里的就是那种混乱我试图整理出一个最好的例子的动作。

一切似乎像它应该是在控制,但我可能是错误的。 这一行动得到成员列表,发送一个到一个视图。 在视图我可以勾选成员我想那些帐户“激活”。 没有ACL,只是简单的身份验证。 我要确保“子管理员”只能看到他们被允许使用一个数据库字段,CLIENT_ID来管理用户。 这两种型号我使用的是用户和客户端。

public function activate() {
    if ($this->request->is('get')) {
        $id = $this->Auth->user('id');
        $this->User->id = $id; //make sure current User is the logged in user
        $currentClient = $this->User->field('client_id'); // get client_id based on logged in user
        $members = $this->User->Client->find('first', array( // find users that have the same client_id
            'conditions' => array('id' => $currentClient),
            'recursive' => 1
        ));
        $this->set('clients', $members); // send the users to the view                  
    } else if ($this->request->is('post') || $this->request->is('put')) {
        $members = $this->request->data['Members']; // grab players submitted from push form
        $memberIds = array(); // this will hold the selected users
        foreach($members as $a){
            $memberIds[$a['id']] = $a['id']; // loop over user's that were selected
        }
        $usersToActivate = $this->User->find('all', array( //find user records, based on the array of id's
            'conditions' => array(
                "User.id" => $memberIds
            )
        ));
        $this->Ticket->bulkActivate($usersToActivate); // send array of members into model for processing
        $this->Session->setFlash('Activations sent.', 'default', array('class' => 'success'));
        $this->redirect(array('action' => 'index'));
    }
}

为了我的眼睛,它看起来并不明显错误......,我已经在模型中做一些处理(如与实际需要的用户记录,并生成激活门票bulkActivate看到)。

但我不禁觉得它不太100%呢。

Answer 1:

我不认为你想只有一个客户端?

$members = $this->User->Client->find('first', array

我想这应该找到所有。 我已经改善这种的情况下使用分页有很多用户。 我可能是错与此但无论你的协会,也不是真正的目标是很清楚,我通过看这个代码。 我不知道该怎么例如票务模型与任何其他数据相关联。 但我猜你正在使用的控制器::使用,你不应该这样做,但获得相关的模型,通过他们的协会。

不要使用太可怕了变量的名称,如$一个,只是吮吸,没有人会知道是什么,在一个较大的代码块或应用手段。 您也命名包含客户数据$成员的阵列,为什么不$客户端? 阅读: 清洁守则和CakePHP的,我建议你遵循CakePHP的编码标准 。

描述的目标,这可能进行重构,甚至更好,我觉得。 如果您要激活的客户有机会获得一票(那是什么样子),为什么你没有票或客户端控制器/模型做呢?

另外这个巨大的在线评论数量只是造成更多的混乱而不是帮助。 写干净,可读的代码和代码会为自己说话。 你有没有做过任何超级复杂的代码或超级复杂的数学存在。 同样,我可以只电子书籍你读“清洁守则”,这在我看来是一个“必须读”为每一个开发人员。

<?php
    // UsersController.php
    public function activate() {
        if ($this->request->is('post') || $this->request->is('put')) {
            $this->User->activate($this->request->data);
            $this->Session->setFlash('Activations sent.', 'default', array('class' => 'success'));
            $this->redirect(array('action' => 'index'));
        }

        this->Paginator->settings['Client'] = array(
            'conditions' => array('id' => $this->Auth->('current_id')),
            'contain' => array(
                'OnlyModelsYouNeedHere'));
        $this->set('clients', $this->Paginator->paginate($this->User->Client)); 
    }
?>

<?php
    // User.php - the model
    public function activate($data) {
        $memberIds = array();
        foreach($data['Members']members as $member) {
            $memberIds[$member['id']] = $member['id'];
        }
        $usersToActivate = $this->find('all', array(
            'conditions' => array(
                'User.id' => $memberIds)));
        return $this->Ticket->bulkActivate($usersToActivate);
    }
?>

路过id可也下调较多,但嘿,它现在晚了这里。 :)以此为代码的重构粗糙,想想我已经改变,更重要的原因。

如果你想看到瘦控制器和脂肪模型的正确例子检查我们的插件了,用户插件UsersController和型号可能会给你一个更大的图片。



文章来源: Guidance trying to make skinny controllers & fat models in CakePHP