4

Controller でこれを行うことはできますか:

$this->User->read(null, $id);
$this->User->find('list');

それが正しいか?

MVC を正しく使用していますか?

これらの簡単な関数はコントローラで使用できますか? または、モデルでこれらの関数を作成する必要がありますか? のようModel->getUser()に、その機能を使用しますModel->read()

関数がモデルによって呼び出されることは知っていますが、いくつかのパラメーターを渡したい場合、関数は大きくなります。たとえば、次のようになります。

$this->User->find('all', array(
    'conditions' => array(
        'User.active' => true,
        'User.group_id' => 3,
        'User.age >=' => 18
    )
));

この関数を Controller で呼び出すことはできますか、それとも Model でカスタム関数を作成して呼び出す必要がありますか? のように... $this->User->findSomeCustomFunction($param1, $param2, $param3)

4

2 に答える 2

4

TLDR:

find()Controller からa を呼び出すことは「問題ありません」が、ベスト プラクティスは、モデルに任意またはすべての find() を配置することです。

モデルにすべての を入れる習慣をつければfind()、長期的にはコードの保守がはるかに簡単になります。

説明/例:

この場合、例として、一見単純な関数から始めることができます。

//User model
public function getUsers() {
    return $this->find('list');
}

しかし、後で、次の行に沿ってさらに何かが必要になる場合があります。

//User model
public function getUsers($opts = array()) {
    $defaults = array(
        'findType' => 'all',
        'activeOnly' => true,
    );
    $params = array_merge($defaults, $opts);
    $qOpts = array('conditions' => array());        

    //active only
    if(!empty($params['activeOnly'])) $conditions[$this->alias.'.active'] = 1;

    return $this->find($params['findType'], $qOpts);
}

(そのコードをより良くする方法がたくさんある場合はご容赦ください。

すべてfind()の をモデルに保持することで、 を作成するたびに各コントローラーを検索して、他の場所find()で同様のものを使用したかどうかを判断する必要がfind()なくなります。チームでプログラミングしている場合、それは悪夢になる可能性があり、コードを複製することはほぼ確実です。

于 2013-03-13T20:08:50.843 に答える
3

Model->find()Controllerから呼び出しても問題ありません。ただし、DRY (Don't Repeat Yourself) の原則にも従う必要があります。これは基本的に、「どこにでもコードをコピーして貼り付けないでください」という意味です。

そのため、多くのコントローラー アクションからこの正確な呼び出しを行う必要がある場合Model->find()は、モデルに対する関数呼び出しに抽象化することをお勧めします。そうです、コントローラーは を呼び出します$this->User->findSomeCustomFunction()

于 2013-03-13T18:50:48.827 に答える