6

我在 Zend Framework 2 应用程序中添加了模块ZfcUser。但是我必须使用现有的数据库表,它的列名与 ZfcUser 的默认表结构略有不同。

ZfcUser wiki 页面中,它说如果我的模型不符合提供的接口,则可以使用自定义映射器。由于我的数据库表不同于默认表,因此我的用户实体类也不同于标准的 ZfcUser\Entity\User。但是我可以通过覆盖文件config/autoload/zfcuser.global.php中的设置来告诉 ZfcUser 轻松使用我自己的类:

'user_entity_class' => 'MyApp\Entity\MyUser',

但到目前为止,我还没有找到一种简单的方法来告诉 ZfcUser 使用我的映射器类。

我只发现映射器是由 ZfcUser\Module::getServiceConfig() 创建的,在其中,我可以看到映射器是从其工厂函数返回的:

// ...
public function getServiceConfig()
{
    return array(
    // ...
        'factories' => array(
            // ...
            'zfcuser_user_mapper' => function ($sm) {
                $options = $sm->get('zfcuser_module_options');
                $mapper = new Mapper\User();
                $mapper->setDbAdapter($sm->get('zfcuser_zend_db_adapter'));
                $entityClass = $options->getUserEntityClass();
                $mapper->setEntityPrototype(new $entityClass);
                $mapper->setHydrator(new Mapper\UserHydrator());
                return $mapper;
            },
            // ...

有没有办法让 ZfcUser 使用我的自定义用户映射器类?

4

3 回答 3

4

建立自己的服务工厂zfcuser_user_mapper,它就会被使用。

于 2012-11-24T14:21:00.590 回答
4

我和你有同样的问题,但最后设法登录到我的应用程序。我听从了 Rob 的建议,在我现有的用户模块中创建了自己的服务工厂。不幸的是,伯恩哈德也在现场。您必须深入研究 ZfcUser 源代码才能使其正常工作。我现在正在处理的项目有一个 MSSQL 服务器,我必须说处理这些事情很难。我最终只调整了 ZfcUser 源中的一个函数以使登录页面正常工作。

我只需要当前应用程序的登录功能,但即将到来的项目更多的是角色驱动。我一直在寻找不会太复杂而无法快速连接的东西,同时为未来提供更多选择和可能性。

这是我现在所做的以及我学到的东西:

我将 Entity 和 Mapper 文件夹从 ZfcUser 目录复制到我现有的 b2bUser(我的模块)文件夹中。一切……甚至是 Mapper 中的 Exception 文件夹。这可能没有必要,但我没有心情弄清楚依赖关系。

在 zfcuser.global.php 文件中,我的活动配置如下所示:

'user_entity_class' => 'b2bUser\Entity\User',
'enable_registration' => false,
'enable_username' => true,
'auth_identity_fields' => array( 'username' ),
'login_redirect_route' => 'home',
'enable_user_state' => false,

我将其余设置保留为默认设置。我从身份验证中删除了电子邮件选项,因为他们不会使用电子邮件地址登录系统。那个user_entity_class是我抄过来的...

Module.php (b2bUser) 将以下内容复制到服务管理器配置中:

'zfcuser_user_mapper' => function ($sm) {
    $mapper = new Mapper\User();
    $mapper->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter'));
    $mapper->setEntityPrototype(new Entity\User());
    $mapper->setHydrator(new Mapper\UserHydrator());
    return $mapper;
},

设置完成后,我更改了 Entity 和 Mapper 中文件的命名空间等,以反映他们的新家。更改了实体和接口以反映我自己的数据结构。我对 Mapper 文件做了同样的事情,并确保 Hydrator 文件中的变量名与我的数据库列名相同。

我将 AbstractDbMapper 文件留在原处。但这是我稍微调整的文件。

这是我的样子。SQLSRV 驱动程序充满了维尼,一直在抱怨一个对象或一个字符串......

protected function select(Select $select, $entityPrototype = null, HydratorInterface $hydrator = null)
{
    $this->initialize();
    $selectString = $this->getSlaveSql()->getSqlStringForSqlObject($select);
    $stmt = $this->getDbAdapter()->driver->createStatement($selectString);
    $stmt->prepare();
    $res = $stmt->execute($stmt);

    $resultSet = new HydratingResultSet($hydrator ?: $this->getHydrator(),
            $entityPrototype ?: $this->getEntityPrototype());
    $resultSet->initialize($res);
    return $resultSet;
}

就是这样。我希望它至少可以帮助某人在他们自己的系统上启动并运行它。我不会像这样离开我的,但让它发挥作用是一项使命。

于 2012-12-15T02:58:29.623 回答
0

目前似乎没有简单的方法可以在不修改 ZfcUser 源的情况下更改表结构。Github 上有一个 pull request 应该可以解决这个问题:

https://github.com/ZF-Commons/ZfcUser/pull/174

于 2012-11-08T16:32:52.747 回答