1

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

Когда пользователь изначально создает Организацию, я хочу автоматически создать запись сотрудника для этой комбинации Пользователь/Организация. (Тип записи будет «Владелец»). В основном это сводится к двум вставкам базы данных: один для организации, другой для Employee.

Я вижу два пути идти об этом:

  1. контроллера может создать новый объект организации и использовать картограф, orgMapper::insert($newOrg), упорствовать его. После этого он может создать новый объект Employee и снова использовать mapper, employeeMapper::insert($newOwner), для сохранения.
  2. Контроллер может создать новый объект Organization, и этот объект выполняет всю оставшуюся работу. Он будет вызывать orgMapper::insert($this), и с возвращенным ключом будет создаваться и сохраняться новый объект Employee.

Во втором подходе есть ряд преимуществ: в модели встроена бизнес-логика (т. Е. Запись сотрудника/владельца для каждой новой организации), а контроллер более сложен. Единственная причина, по которой я сомневаюсь, это значит, что мой домен становится зависимым от моего картографа.

Я бы использовал фабрику в этом домене, чтобы получить картографию, так что вся связь будет сведена к одной точке. Означает ли это, что зависимость приемлема? Или у меня есть более глубокая проблема дизайна?

Я немного ознакомился с уровнем обслуживания. Возможно, это то, где я должен смотреть?

Я использую PHP и Zend Framework

Ваши мысли очень ценятся. Моя кошка и я исчерпали наши собственные идеи ...

+1

Я бы больше посмотрел на сервисный уровень какого-то типа, который является единственным заданием, управляющим ссылочной целостностью db, и вынимает эту работу из отдельных карт данных. По крайней мере, хотя код, необходимый для этого, будет очень коротким, он должен предоставить вам многоразовые закодированные правила для управления другими проектами, которые работают с одним и тем же набором данных. ИМХО. Надеюсь, у меня есть смысл. Но, возможно, может быть функция уровня db, которую вы могли бы упустить, в зависимости от того, какое программное обеспечение db вы используете. Какую базу данных вы используете? –

+0

@ bob-the-destroyer, я использую mySql –

+0

какой движок для этих таблиц? Миисам или презерватив? –

ответ

2

Поскольку я не являюсь пользователем ZF (и избегал этого), возможно, мое решение не применимо.

Карты данных не должны работать только с одной таблицей в базе данных. Вместо этого, когда вы храните новую запись Organization (и я думаю, что экземпляр Organization содержит коллекцию объектов Employee), то картограф также должен создать все записи для сотрудников и сопровождающие данные в таблице OrganizationEmpoyees.

Короткий ответ: нет, хранение ответственность сборщик.

Если я неправильно понял структуру БД, и как это относится к «(..) запись Сотрудник для этого пользователя комбинации/организации» и объекты Employee домена полностью отделены от Organization, то первый из ваших решения были бы приемлемыми.


Что касается добавления службы поверх объектов домена и картографов, это было бы хорошей идеей. Потому что вы уже протекали логику домена внутри контроллера. Кажется, что это плохо.

0

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

Например, я хочу сохранить некоторые данные из своей музыкальной коллекции, данные в настоящее время находятся в файле csv. Мой контроллер анализирует файл csv и помещает каждую строку данных в массив, который я пересылаю методу класса, который сортирует данные в объектах и ​​сохраняет их в базе данных. (Plz внимание этот метод является предварительным и требует тонкой настройки и регулировки)

//FROM class Application_Model_Tag 
public function saveTags() { 
     //TODO implement instantiation of Domain Models instead of passing arrays to mappers 
     $trackMapper = new Music_Model_Mapper_Track(); 
     $artistMapper = new Music_Model_Mapper_Artist(); 
     $albumMapper = new Music_Model_Mapper_Album(); 

     if (isset($this->_hash)) { 
      //see if track already exists by comparing hashs 
      $trackRow = $trackMapper->fetchByColumn('hash', $this->getHash()); 
      //if track does not exist 
      if (is_null($trackRow)) { 
       //save the artist 
       $artistData = array(
        'name' => $this->getArtist() 
       ); 
       //see it the artist exists by name 
       $artistRow = $artistMapper->fetchByColumn('name', $this->getArtist()); 
       //does artist exist? 
       if (is_null($artistRow)) { 
        $artistRow = $artistMapper->save($artistData); 
       } 

       //Save the Album Data 
       //does the album exist? 
       $albumRow = $albumMapper->fetchByColumn('name', $this->getAlbum()); 
       //if yes 
       if (is_null($albumRow)) { 
        $albumData = array(
         'name'  => $this->getAlbum(), 
         'artist_id' => $artistRow->id, 
         'art'  => $this->getAlbum() . '.jpg', 
         'year'  => $this->getYear() 
        ); 
        //get album row 
        $albumRow = $albumMapper->save($albumData); 
       } 
       //Save track data 
       $trackData = array(
        'title'  => $this->getTitle(), 
        'filename' => $this->getFilename(), 
        'path'  => $this->getPath(), 
        'format' => $this->getFormat(), 
        'genre'  => $this->getGenre(), 
        'artist_id' => $artistRow->id, 
        'album_id' => $albumRow->id, 
        'track'  => $this->getTrack(), 
        'play_time' => $this->getPlay_time(), 
        'hash'  => $this->getHash() 
       ); 
       //save track data 
       $trackMapper->save($trackData); 
      } 
     } else { 
      return; 
     } 
    } 

Я надеюсь, что это помогает, и, пожалуйста, простите непродуманность примера.

Смежные вопросы