Проверка повторяющихся значений в классе Model

У меня есть модель 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? (запрос, конечно, должен быть другим, если «сущность» новая или у нее уже есть идентификатор, но суть моего вопроса не в этом).

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


person cambraca    schedule 11.01.2011    source источник


Ответы (2)


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

-Application_Model_Entity это чистая структура для данных, этот класс не имеет зависимостей
-Application_Model_EntityMapper обладает правом общаться с dbrms, будет преобразовывать Сущности в Записи и наоборот. Он "владеет" классом ActiveRecord (DbTable) -Application_Model_DbTable_Entity это класс ActiveRecord, он расширяется от Zend_DbTable_Abstract и может выполнять запросы к БД, он используется только картографом.

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

Я надеюсь, что код объясняет сам себя. Это самый «зендский» способ, который я могу найти, надеюсь, он поможет вам на пути к zf-сообществу :)

Ссылка на руководство по Zend_Validate_*

person Samuel Herzog    schedule 11.01.2011
comment
просто немного информации для добавления: структура Model/Mapper/ActiveRecord точно такая же, как в кратком руководстве по ZendFramework. - person Samuel Herzog; 11.01.2011

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

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

person cambraca    schedule 11.01.2011