Модель Zend Framework Абстрактные и нулевые значения - PullRequest
1 голос
/ 09 декабря 2010

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

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

1 Ответ

1 голос
/ 09 декабря 2010

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

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

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

...