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

ZfcUser wiki page中,它表示如果我的模型不符合所提供的接口(interface),则可以使用自定义映射器。
而且由于我的数据库表与默认表不同,因此我的用户实体类也与
标准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使用我的自定义用户映射器类?

最佳答案

我遇到了与您相同的问题,但是最后设法登录到了我的应用程序。我遵循Rob的建议,并在现有用户模块中创建了自己的服务工厂。不幸的是,伯恩哈德(Bernhard)也在现场。您必须深入研究ZfcUser源代码才能使其正常工作。我正在从事的项目现在有一个MSSQL服务器,我必须说很难掌握所有内容。我最终仅在ZfcUser源代码中调整了一个功能,以使登录页面正常工作。

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

这是我现在所做的以及所学到的内容:

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

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

'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中文件的 namespace 等,以反射(reflect)它们的新位置。更改了实体和接口(interface)以反射(reflect)我自己的数据结构。我对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;
}

就是这样。我希望它至少可以帮助某人在自己的系统上启动并运行它。我不会像这样离开我的,但是让它工作起来有点任务。

关于php - ZF2 : Custom user mapper for ZfcUser modu,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13186809/

10-11 09:08