我使用了一个简单的指令 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来说我比较新,我想亲自尝试一下。
答案 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'的工厂。这应该使你的例子工作。