Использование Doctrine для абстрагирования операций CRUD - PullRequest
3 голосов
/ 03 июня 2010

Это беспокоило меня довольно долго, но теперь мне необходимо найти ответ.

Мы работаем над довольно крупным проектом с использованием CodeIgniter plus Doctrine.

Наше приложениеимеет внешний интерфейс и область администратора для проверки / изменения / удаления данных.

Когда мы проектировали внешний интерфейс, мы просто использовали большую часть кода Doctrine прямо в контроллере:

//In semi-pseudocode
function register()
{
  $data = get_post_data();

  if (count($data) && isValid($data))
  {
    $U = new User();
    $U->fromArray($data);
    $U->save();

    $C = new Customer();
    $C->fromArray($data);
    $C->user_id = $U->id;
    $C->save();

    redirect_to_next_step();
  }
}

Очевидно, что когда мы пошли делать административные представления, началось дублирование кода, и, учитывая, что мы были в режиме «получи это», теперь он воняет от раздувания кода.

Я переместил много функций(бизнес-логика) в модель с использованием методов модели, но базовый CRUD там не подходит.

Я собирался попытаться поместить CRUD в статические методы, то есть Customer :: save ($ array) [выполнять вставку и обновление в зависимости от того, присутствует ли в массиве prikey], Customer :: delete ($ id), Customer :: getObj ($ id = false) [если false, получить все данные].Это станет болезненным, хотя для 32 объектов модели (и растет).

Кроме того, иногда модели должны взаимодействовать (как взаимодействие выше между данными пользователя и данными клиента), что невозможно сделать встатический метод без нарушения инкапсуляции.

Я предполагаю добавить к этому еще один слой (предоставление веб-сервисов), поэтому, зная, что в какой-то момент будет 3 «контроллера», мне нужно где-то инкапсулировать этот CRUD (очевидно), но статические методы - это путь, или есть другой путь?

Ваш вклад очень важен.

Ответы [ 2 ]

2 голосов
/ 06 июня 2010

Почему бы не использовать фасад?

class RegistrationManager {
 public function register( $postData, $callBack ){
      $data = get_post_data();
      if (count($data) && isValid($data)){
        $U = new User();
        $U->fromArray($data);
        $U->save();
        $C = new Customer();
        $C->fromArray($data);
        $C->user_id = $U->id;
        $C->save();
        $callBack(); //I like this but you need PHP5.3
      }
     }
 }

В контроллерах вашего приложения:

$r = new RegistrationManager;
$r->register( get_post_data(), function(){ redirect_to_next_step(); } );

Фасады тоже модели (на мой взгляд), вы можете использовать их, чтобы скрыть проводки или сложности и уменьшить дублирование кода.

2 голосов
/ 04 июня 2010

Я думаю, вам нужно поместить эту логику в таблицы class'es

class UserTable extends Doctrine_Table
{
  public function register()
  {
    // There you do data model (not concrete object) related stuff
  }
}

http://www.doctrine -project.org / проекты / ОРМ / 1,2 / Docs / Поваренная книга / код-воспламенитель-и-доктрина / ан

...