2010-06-03 7 views
3

Это беспокоило меня довольно долгое время, но теперь мне нужно найти ответ.Использование доктрины для абстрактных операций CRUD

Мы работаем над довольно большим проектом, используя CodeIgniter plus 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(); 
    } 
} 

Очевидно, когда мы пошли, чтобы сделать дублирование просмотров админ коды начали и учитывая, что мы были в " get it DONE ", поэтому он теперь воняет с раздуванием кода.

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

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

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

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

Ваш вклад очень ценится.

ответ

2

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

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(); }); 

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

+0

Это имеет смысл. Я думаю, я слишком сильно задумался, думая, что Модель должна быть в соотношении 1: 1 к таблице; нужно думать больше за пределами коробки. Благодарю. – TomWilsonFL

2

Я думаю, что вам нужно положить, что логика таблиц 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/projects/orm/1.2/docs/cookbook/code-igniter-and-doctrine/en

+0

Спасибо. У вас хороший глаз. Я никогда не замечал эту часть документации. Я буду принимать это во внимание. – TomWilsonFL