CodeIgniter - MVC подход к вопросу - PullRequest
1 голос
/ 25 июля 2011

В настоящее время я делаю приложение в CodeIgniter, и мне было интересно, как мне поступить с моделями.То, как я его сейчас настроил:

Представления: отображать контроллеры: отображать связанные вещи, проверять форму, перенаправлять, общаться с библиотеками и т. Д. Библиотеки: выполнять тяжелую работу, общаться с моделями, генерировать ошибкисообщения, журналы и т. д. Модели: общение с БД

(в большинстве случаев я использую Active Record)

Позвольте мне перейти к примеру:

Iу меня есть библиотека Auth, и внутри у меня есть запросы, которые в некоторой степени похожи, варьируются только значением в предложении WHERE.

Пример:

get_by_id($id);
get_by_password_hash($email);
get_by_email($email);

Должен ли я иметь несколько этих дубликатов моделифункции или я должен просто иметь одну простую функцию, где я передаю предложения WHERE и тому подобное через библиотеку?

Пример:

$where = array('id' => $id);
get($where);

Пожалуйста, дайте мне знать, если вы хотите, чтобы я что-то прояснил,Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 25 июля 2011

Я точно знаю, откуда вы, потому что у меня были те же сомнения несколько месяцев назад.

Я использую https://bitbucket.org/philsturgeon/codeigniter-base-model/src/93a643d0d46f/MY_Model.php

Просто используйте его как библиотеку. Вы создаете модели как

// user_m.php
<?php (defined('BASEPATH')) OR exit('No direct script access allowed');
class User_m extends MY_Model
{}

Выше могут быть любые пользовательские функции, кроме основных CRUD.

Вы запускаете код в вашем контроллере как

   $this->load->model('user_m');
   $this->data['user'] = $this->user_m->get($user_id);

или

   $this->load->model('user_m');
   $this->data['user'] = $this->user_m->get_by(array('something_id' => $something));

В нем есть все основные операции CRUD, которые вам нужны. Просто прочитайте код, он довольно хорошо задокументирован.

1 голос
/ 25 июля 2011

Если у вас есть много get_by_* методов для данной модели, тогда имеет смысл использовать магический метод, как предложил ТейлорОтвелл.На самом деле, метод __call, а также __get и __set часто используются в других средах, чтобы упростить выполнение именно того, о чем вы говорите.Просто помните, что CI не будет хорошо играть с методом __call Magic на контроллере во время отображения (но это не повлияет на модель).

Основной способ посмотреть на CMV в CI:

  • Библиотеки - это то место, где происходит большая часть "логики рендеринга", но обычно она должна быть независимой от управления / модели / представления.Почти полностью без состояния (мое предпочтение).
  • Помощники - вспомогательные функции, в основном связанные с просмотром (все остальное действительно лучше как библиотека (более ортогонально, yada, yada, yada))
  • Контроллер - загружает библиотеки / модели и вызывает методы
  • Модель - слой переноса БД.Почти полностью с состоянием (мое предпочтение).
  • Представления - Отображение данных

Часто контроллер будет делать такие вещи, как:

class Users
{
    function display( $id )
    {
        $this->load->library( 'myformatlib' );
        $this->load->model( 'mymodel' );
        $data = $this->mymodel->get_user( $id );
        $formatted = $this->myformatlib->addColors( $data );
        $this->mymodel->incrementViews( $id );
        $this->load->view( 'full_user', $formatted );
    }
}

Что касается прохождения, гдепункты - запросы к БД должны быть почти полностью отнесены к модели, если нет другой опции, или было бы чрезмерно громоздко делать это (но я хотел бы спросить, не могли бы вы это изменить).

1 голос
/ 25 июля 2011

Вы можете использовать PHP __call Magic Method в вашей модели для обработки любого простого предложения where:

public function __call($method, $parameters)
{
    if (strpos($method, 'get_by_') === 0)
    {
        $this->get(array(substr($method, 7), $parameters[0]));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...