0

Работая над частью входа в систему, я обнаружил, что столкнулся с проблемой:В Zend_Auth можно ли получить объект User-модели домена вместо stdClass?

Моя модель основана на Active Record, расширяя объекты Zend_Db_Table_Row. Всякий раз, когда мне приходится иметь дело с пользователем, я бы хотел сделать это через объект User (будучи расширенной строкой таблицы). Однако Zend_Auth_Adapter_DbTable :: getResultRowObject() возвращает stdClass, и я не могу найти способ сообщить Zend_Auth_Adapter_DbTable использовать определенный Db_Table.

Мои три варианта, которые я нашел до сих пор:

  1. написать собственный Zend_Auth_Adapter, чтобы вернуть правильный объект класса (с использованием Zend_Db_Table внутри).

  2. После аутентификации выполните некоторое чтение stdClass и некоторую запись объекта User - можете ли вы создать класс Zend_Db_Table_Row без фактического использования Zend_Db_Table для его создания?

  3. Отойдите от активной записи до полной разработки домена, отделяя мой доступ к данным от объекта пользователя. Затем напишите второй блок отображения, чтобы заполнить объект User с помощью stdClass вместо строки таблицы.

Мои два вопроса: Какие из них вы бы порекомендовали? И есть ли что-то, что мне не хватает?

Мне не хотелось бы делать что-либо из этого, а затем выяснить, что я пропустил что-то очевидное в Рамочной программе. Кто-нибудь знает, есть ли «правильный» способ сделать это?

С уважением, Sander

ответ

1

Там нет «правильного» способа сделать то, что вы хотите. Подходы, которые вы показываете, должны работать.

Лично я выступаю за сохранение только идентификатора пользователя в Zend_Auth - если вы должны были хранить полный объект со всеми подробностями пользователя, он бы выпал из синхронизации, если пользователь должен был изменить свою информацию.

В проекте я однажды написал плагин контроллера, который предоставил пользователю контроллеры. Он в основном взял идентификатор от Zend_Auth и построил на нем пользовательский объект. Он также создал анонимный пользовательский объект в случае отсутствия идентификатора. Не сказать, что это лучший подход, но он прозрачен и работает.

0

В particullar я использую раствор № 2, у меня есть пользовательский объект идентификации, который оборачивает Zend_Auth, поэтому при входе в систему, у меня есть это:

public function login($user, $password) { 
    if(!($this->adapter instanceof Zend_Auth_Adapter_DbTable)) { 
     throw new Gecko_Auth_Exception("The Adapter is not valid or not initialized"); 
    } 

    $auth = Zend_Auth::getInstance(); 

    $this->adapter->setIdentity($user); 
    $this->adapter->setCredential($password); 

    $result = $auth->authenticate($this->adapter); 
    if($result->isValid()) { 
     $data = $this->adapter->getResultRowObject(null, $this->passwordColumn); 
     $userObject = new self::$userClass($data); 
     $auth->getStorage()->write($userObject); 
     return true; 
    } else { 
     return false; 
    } 
} 

Тогда я могу позвонить Zend_Auth :: getInstance для возврата пользовательского объекта UserClass, чтобы я мог сопоставить свой собственный класс Zend_Db_Table_Row.

Надеется, что это помогает