Я использую некоторые абстрактные классы моделей от 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, «Choose your option»)). Но это даст мне ошибку, потому что пустая строка не является допустимым идентификатором внешнего ключа или нулевым, что также будет разрешено.
Моей первой попыткой было проверить в моем контроллере, который обрабатывает форму, является ли значение select elements значком emptry и изменить его на null. Это уродливо, и проблема была в том, что мой установщик изменил ноль на 0, потому что я проверяю его с помощью (int) $ value.
public function setId($value)
{
$this->_id = (int) $value;
return $this;
}
Таким образом, другой подход состоял в том, что я проверяю в своем установщике, является ли значение нулевым, и затем я не проверяю его с помощью (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) в установщике. Потому что, насколько я видел, это похоже на обычный способ использовать сеттер.
С уважением,
Нико