Zend Authentication&Zend \ Authentication \ Adapter \ DbTable'验证时出错

时间:2013-05-16 06:40:51

标签: authentication zend-framework2

我使用了一个简单的指令 http://framework.zend.com/manual/2.0/en/modules/zend.authentication.adapter.dbtable.html#advanced-usage-by-example用于Zend身份验证。

这是我的代码:

$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来说我比较新,我想亲自尝试一下。

2 个答案:

答案 0 :(得分: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)

我知道这是一个旧的,你现在可能已经得到了答案。即便如此,我会在这里为更多用户提供答案。我自己也面临很多类似的问题,教程期望我们有一些先决条件。

发生此错误是因为您在获取数据库适配器的语句中并不完全正确。您需要使用本地或全局配置中定义的字符串调用服务管理实例。例如:

我在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中,我有凭据和信息到达我的数据库服务器,如下所示:

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

这足以定义我的服务calle' Zend \ Db \ Adapter \ Adapter'。然后,为了实例化我的Db适配器,我在控制器的任何函数内都有以下几行:

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

重要的是要注意这里的适配器是一个类变量。因此,它必须在我的控制器类中定义,如:

public $adapter;

此步骤足以让您获得数据库适配器。我假设你没有一个名为' adapter'的工厂。这应该使你的例子工作。