Куда добавить 3 функции и как написать findByUsername — Zend Framework

У меня есть модель User.php, модель DbTable/User.php и файл UserMapper.php, как описано в документации Zend.

У картографа есть fetchAll(), find($id), getDbTable(), save() и setDbTable().

Если я хочу добавить следующие функции:

  1. function DoesUsernameExistAlready($username) {возвращает логическое значение}
  2. функция findByUsername($username) {возвращает $user}
  3. function enableUser($user) {просто активируйте $user}

Чтобы следовать лучшим практикам Zend, куда следует добавить 3 функции? Должны ли они быть добавлены в UserMapper.php или User.php? Или они принадлежат контроллеру (UserController)?

Как для findByUsername написать функцию, которая будет искать имя пользователя в моей таблице User? В моем случае имя пользователя - это адреса электронной почты и они уникальны (как определено в MySQL).


person ews2001    schedule 18.06.2012    source источник
comment
Mapper определенно место для этого. для поиска имени пользователя воспользуйтесь Zend_Validate_Db_RecordExists валидатором, так как это может сократить то, что вы хотите сделать, в противном случае об этом может позаботиться простой выбор.   -  person drew010    schedule 18.06.2012


Ответы (1)


@ drew010, как обычно, прав, поместите эти функции в свой маппер. Честно говоря, все это, вероятно, можно было бы поместить в абстрактный или базовый картограф, чтобы функциональность была доступна для всех ваших картографов.

вы можете легко создать функцию recordExists() в вашем картографе и просто передать таблицу и столбец в качестве аргументов:

  //you can either pass in the table name or have it be a property
  public function recordExists($table = null, $column) {
      //The table syntax may change depending on the scope
        $table = $this->_tableName;
        $exists = new Zend_Validate_Db_RecordExists(array(
        'table' => $table,
        'field' => $column
        )):

    return $exists;
    }

для метода findBy() мне нравится передавать в метод 3 переменные, а затем использовать fetchAll() для возврата массива объектов. Таким образом, если столбец возвращает одну строку или пятьдесят строк, я обрабатываю вывод одинаково.

    /**
     * findByColumn() returns an array of rows selected
     * by column name and column value.
     * Optional orderBy value, pass $order as string ie 'id ASC'.
     *
     * @param string $column
     * @param string $value
     * @param string $order
     * @return array returns an array of objects
     */
public function findByColumn($column, $value, $order = NULL) {
        $select = $this->_getGateway()->select();
        $select->where("$column = ?", $value);
        if (!is_null($order)) {
            $select->order($order);
        }
        $result = $this->_getGateway()->fetchAll($select);
        $entities = array();
        foreach ($result as $row) {
            //create objects
            $entity = $this->createEntity($row);
            $entities[] = $entity;
        }
        return $entities;
    }

что касается вашего последнего вопроса, вы можете активировать запись действительно просто, выбрав строку, а затем сохранив только переключатель, я предполагаю, что вы установили флаг или логическое значение какого-либо типа для активации записи. Этому, вероятно, нужно будет войти в конкретный UserMapper, поскольку я обнаружил, что с методом, который я использую для сохранения записей, базовый метод save() не всегда работает.

 //you'll set the activate switch when the user object is instantiated
    public function activate(Application_Model_User $user) {
        if (!is_null($user->id)) {
            $select = $this->_getGateway()->select();
            $select->where('id = ?', $user->id);
            $row = $this->_getGateway()->fetchRow($select);
            $row->activate = $user->activate;
            //This is the cool thing about save(), you can change as many or few columns as you need.
           $row->save()
        return $row;  
        } else {
           //handle error, as we only want to be able to change an existing user.
        }

    }

Это может быть больше, чем вам нужно, но я надеюсь, что это поможет.

person RockyFord    schedule 18.06.2012
comment
Удивительный ответ, спасибо за длинное описание, это именно то, что я искал ... очень признателен. - person ews2001; 18.06.2012
comment
@RockyFord :-p вы так добры. Очень хороший ответ, раньше я ленился. У вас все равно лучше, так что получилось :) - person drew010; 18.06.2012