2013-05-16 3 views
0

Я использовал простую инструкцию от
http://framework.zend.com/manual/2.0/en/modules/zend.authentication.adapter.dbtable.html#advanced-usage-by-example для аутентификации Zend.Zend Authentication 'Zend Authentication Adapter DbTable' дает ошибку при аутентификации

Вот мой код:

$adapter = $sm->get('adapter'); 
$authAdapter = new DbTable($adapter); 
$authAdapter -> setTableName('users')->setIdentityColumn('username')->setCredentialColumn('password'); 
$authAdapter -> setIdentity('admin')-> setCredential('password'); 
$authAdapter -> authenticate(); 

Приведенный выше код генерирует ошибку следующим образом: Предоставленные параметры в DbTable не в состоянии произвести действительное утверждение SQL, пожалуйста, проверьте имена таблиц и столбцов для действия.

Я знаю, имеет ли смысл использовать модуль ZF-Commons и ZF-Users, а не изобретать колесо ... но, будучи относительно новым для ZF2, я хочу попробовать сам.

+0

Вы создали таблицу пользователей в своей базе данных? –

+0

@Ezequiel - yup, я создал простую таблицу пользователей. Адаптер $ все в порядке, я попробовал, указав всех пользователей таблицы. Вот снимок таблицы пользователей. https://www.dropbox.com/s/9au01uwlz2egfzr/shot_130516_130443.png Надеюсь, я не сделал ничего глупого. – Laxman

+0

Возможно, используйте метод '$ adapter-> getDbSelect();', чтобы увидеть, как выглядит SQL? –

ответ

0

право Ответ на этот вопрос там в сообщении об ошибке, Zend\Authentication\Adapter\DbTable ожидает больше, чем просто адаптер в качестве параметра, он также нуждается имя таблицы и имя идентификатора и верительных столбцов ...

$authAdapter = new DbTable($dbAdapter, 
          'tableName', 
          'identifierColumnName', 
          'credentialColumnName' 
          ); 

Эта информация содержится в документах, которые всегда являются хорошей отправной точкой ->http://zf2.readthedocs.org/en/release-2.1.4/modules/zend.authentication.adapter.dbtable.html

+1

Он фактически устанавливает эти требуемые параметры, используя методы настройки. –

+0

yup, @Crisp. Я установил эти параметры из методов setter. – Laxman

+0

heh, раннее утро, я вижу, что после кофе или два: o), работает ли это, если вы не используете методы setter и не создаете экземпляр с параметрами? – Crisp

0

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

Эта ошибка возникает из-за того, что вы не совсем правы в инструкции, чтобы получить адаптер DB. Вам нужно вызвать экземпляр управления службой со строкой, определенной в ваших локальных или глобальных конфигурациях. Например:

я этот завод определен в моем global.php файле:

return array(
    'service_manager' => array(
     'factories' => array(
      'Zend\Db\Adapter\Adapter' 
        => 'Zend\Db\Adapter\AdapterServiceFactory', 
     ), 
    ), 
    'db' => array(
     'driver'   => 'Pdo', 
     'driver_options' => array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
     ), 
    ), 
); 

В моей local.php у меня есть полномочия и информацию, чтобы достигнуть моего DB сервера следующим образом:

return array(
    'db' => array(
     'username' => 'valid_dbusername', 
     'password' => 'valid_dbpass', 
     'dsn'   => 'mysql:dbname=valid_dbname;host=valid_dbserver', 
    ), 
); 

Этого достаточно для определения моего сервиса «Zend \ Db \ Adapter \ Adapter». Затем, чтобы создать экземпляр моего адаптера Db У меня есть следующие строки внутри любой функции в моем контроллере:

if (!$this->adapter) { 
    $sm = $this->getServiceLocator(); 
    $this->adapter = $sm->get('Zend\Db\Adapter\Adapter'); 
} 

Важно отметить, адаптер здесь является переменной класса. Таким образом, это должно быть определено внутри моего класса контроллера, например:

public $adapter; 

Этим шагам достаточно, чтобы получить адаптер БД. Я предполагаю, что у вас нет фабрики под названием «адаптер». Это должно заставить ваш пример работать.