Абстрактная модель Zend Framework и нулевые значения

Я использую некоторые абстрактные классы моделей из Zend.

  • Default_Model_Abstract: содержит __set и __get, а также сеттер и геттер для каждого значения и работает как виртуальный объект.
  • Default_Model_AbstractMapper: содержит такие методы, как save(), find(), fetchall() и так далее.

Я нашел это решение несколько месяцев назад в документации Zend Quick Start. Но в последние месяцы у меня были некоторые проблемы с нулевыми значениями.

У меня есть элемент Zend_Form_Element_Select, который получил значение из базы данных. Его значения - это идентификаторы из внешнего ключа. Таким образом, принимается только действительный идентификатор внешнего ключа или ноль. Но элемент Zend_Form_Element_Select является необязательным, поэтому возможно, что в результате я получу пустую строку (->addMultiOption(null, 'Выберите свой вариант')). Но это даст мне ошибку, потому что пустая строка не является допустимым идентификатором внешнего ключа и не является нулем, что также разрешено.

Моя первая попытка состояла в том, чтобы проверить мой контроллер, который обрабатывает форму, если значение элемента select является пустой строкой, и изменить его на null. Это некрасиво, и проблема заключалась в том, что мой установщик изменил значение null на 0, потому что я проверяю его с помощью (int) $value.

public function setId($value)
{
    $this->_id = (int) $value;
    return $this;
}

Итак, другой подход заключался в том, что я проверяю свой установщик, если значение равно null, а затем не проверяю его с помощью (int). Это выглядело бы примерно так.

public function setId($value)
{
    if($value !== null)
        $this->_id = (int) $value;
    return $this;
}

Это сработает в этом случае, но я не вижу смысла, потому что иногда я хочу сбросить существующее значение до нуля. Поэтому я не могу игнорировать значения с нулевым значением в установщике. Итак, другой подход:

public function setId($value)
{
    if($value !== null)
        $this->_id = (int) $value;
    else
        $this->_id = null;
    return $this;
}

Но теперь это действительно происходит некрасиво. Мне любопытно посмотреть, как вы, люди, решите эту проблему. Потому что я думаю, что должно быть простое решение без простого удаления (int) в установщике. Потому что, насколько я видел, это обычный способ использования сеттера.

С уважением, Нико


person Nico    schedule 09.12.2010    source источник
comment
Это не ответ на вашу проблему с __set или __get, но вы можете проверить это в контроллере с помощью if(trim($yourselect) == '') $yourselect = null; ?   -  person Ashley    schedule 09.12.2010


Ответы (1)


Я не могу придумать никакого другого способа сделать это логически. Если вы обнаружите, что это слишком многословно, вы можете превратить if/else в выражение тернарного оператора. Это сделало бы его однострочным.

$this->_id = ($value !== NULL) ? (int) $value : NULL;
return $this;

Другой вариант — переместить ваш if/else в пользовательский Zend_Filter, например NullOrInt. Это можно повторно использовать везде, где вам нужна эта проверка, например. на уровне контроллера для проверки ввода запроса или в Zend_Form или в вашем сеттере и т. д.

person Gordon    schedule 09.12.2010
comment
Это отличное решение, спасибо, Гордон. Я буду использовать валидатор, чтобы я мог оставить всю логику форме и больше не заботиться о контроллере или модели. - person Nico; 10.12.2010