Я использую некоторые абстрактные классы моделей из 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) в установщике. Потому что, насколько я видел, это обычный способ использования сеттера.
С уважением, Нико