2011-01-11 3 views
1

У меня есть модель, Entity, и я создал EntityMapper и класс Entity (я просто изучаю использование Zend Framework и следую инструкциям). Класс Entity имеет метод setName, и то, что я хочу, это проверить, существует ли еще одна «сущность» в БД с тем же именем, и в этом случае выкинуть исключение или что-то еще.Проверка повторяющихся значений в классе модели

Итак, если я правильно понимаю, вызовы БД должны быть только в классе Mapper. Таким образом, внутри setName, я должен сделать что-то вроде:

$entity = new Application_Model_EntityMapper(); 
if ($entity->checkDuplicateName($name, $this->_id)) 
    $this->_name = $name; 
else 
    throw new Exception(...); 
return $this; 

и поставить код, который делает запрос в новом методе в классе Mapper? (запрос должен, разумеется, отличаться, если «сущность» является новой или уже имеет идентификатор, но это не вопрос моего вопроса).

Я знаю, что мог бы сделать это несколькими способами, но моя цель - максимально адаптироваться к соглашениям рамки.

ответ

2

Поскольку сбережение является обязанностью Mapperobject, я бы добавил проверку на процедуру сохранения вашего класса сопоставления. я не понял, что соответствующие обязанности ваши различные классы, так что я объясню мое:

- Application_Model_Entity это чистая структура данных, этот класс не имеет зависимостей
- Application_Model_EntityMapper обладают право говорить с dbrms, преобразует Entities in Records и наоборот. Он «владеет» классом ActiveRecord (DbTable) - Application_Model_DbTable_Entity является классом ActiveRecord, он простирается от Zend_DbTable_Abstract и способен выполнять запросы к БД, он используется только Mapper.

$entity = new Application_Model_Entity(); 
$entity->setName('something which already exists'); 

$mapper = new Application_Model_EntityMapper(); 
$mapper->save($entity); // throws Exception 

// works with: 
class Application_Model_EntityMapper 
{ 
    /** @var Application_Model_DbTable_Entity */ 
    private $dbTable; 

    ... 

    public function save(Application_Model_Entity $entity) 
    { 
     $doValidation = ! $entity->getId(); // no id means not in db yet 
     if ($doValidation) 
     { 
      $hasDuplicatesValidator = new Zend_Validate_Db_RecordExists(
       'table' => 'entity', 
       'field' => 'name' 
      ); 
      $hasDuplicates = $hasDuplicatesValidator->isValid($entity->getName()); 
      if ($hasDuplicates) 
      { 
       throw new Exception('There is already a record in the db with this name!'); 
      } 
     } 
     // go on and save 
     $this->dbTable->save($entity); 
    } 
} 

Надеюсь, код объяснит сам. Это самый «zendish» способ я могу найти, надеюсь, это поможет вам на вашем пути к ОГНЮ-сообществу :)

Ссылка на manual for Zend_Validate_*

+0

только немного информации, чтобы добавить: структура модель/Mapper/ActiveRecord - это то же самое, что и в учебнике «quickstart» для ZendFramework. –

+0

это очень полезно, именно то, что я искал, спасибо !!! – cambraca

+0

рад помочь :) –

0

Я обнаружил, что делает этот чек в setName заставляет его выполнить запрос каждый раз, когда он загружает запись из БД (не хорошо), так что я переехал вызов checkDuplicateName к save методу класса Mapper. (checkDuplicateName также относится к классу Mapper, как частный метод)

Я все равно хотел бы знать, является ли это стандартным способом делать подобные вещи в Zend Framework.

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