Luk*_*tas 6 php config module zend-framework2 zfcuser
我在我的Zend Framework 2应用程序中添加了模块ZfcUser.但是我必须使用现有的数据库表,它的列名与ZfcUser的默认表结构略有不同.
在ZfcUser wiki页面中,它表示如果我的模型不符合提供的界面,则可以使用自定义映射器.由于我的数据库表不同于默认值,因此我的用户实体类也与标准ZfcUser\Entity\User不同.但是我可以通过覆盖文件config/autoload/zfcuser.global.php中的设置来告诉ZfcUser轻松使用我自己的类:
'user_entity_class' => 'MyApp\Entity\MyUser',
Run Code Online (Sandbox Code Playgroud)
但到目前为止,我还没有找到告诉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;
},
// ...
Run Code Online (Sandbox Code Playgroud)
有没有办法让ZfcUser使用我的自定义用户映射器类?
小智 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,
Run Code Online (Sandbox Code Playgroud)
我将其余设置保留为默认值。我从身份验证身份中删除了电子邮件选项,因为他们不会使用电子邮件地址登录系统。这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;
},
Run Code Online (Sandbox Code Playgroud)
设置完成后,我更改了 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;
}
Run Code Online (Sandbox Code Playgroud)
就是这样。我希望它至少可以帮助人们在自己的系统上启动并运行它。我不会就这样离开我的,但让它发挥作用是一项使命。
| 归档时间: |
|
| 查看次数: |
6581 次 |
| 最近记录: |