ZF2:ZfcUser模块的自定义用户映射器

时间:2012-11-01 23:00:09

标签: php module config zend-framework2 zfcuser

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

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

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

但到目前为止,我还没有找到告诉ZfcUser使用我的mapper类的简单方法。

我发现映射器是由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使用我的自定义用户映射器类?

3 个答案:

答案 0 :(得分:4)

我遇到了和你一样的问题,但终于成功登录了我的应用程序。我按照Rob的建议,在我现有的用户模块中创建了自己的服务工厂。不幸的是伯恩哈德也是现货。你有点必须深入研究ZfcUser源代码才能使它工作。我正在研究的项目现在有一个MSSQL服务器,我必须说,处理事情很困难。我最终只调整了ZfcUser源中的一个函数,以使登录页面正常工作。

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

以下是我现在所做的以及我所学到的:

我将实体和映射器文件夹从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;
}

就是这样。我希望至少可以帮助别人在自己的系统上运行它。我不会这样离开我的,但要让它发挥作用是一个任务。

答案 1 :(得分:3)

zfcuser_user_mapper创建自己的服务工厂,它将被使用。

答案 2 :(得分:0)

目前似乎没有简单的方法来更改表结构而不修改ZfcUser源。在Github上有一个pull请求可以解决这个问题:

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