Zend Framework 2:如何为ZfcUser创建自己的用户映射器

时间:2014-09-23 14:57:31

标签: php zend-framework2

我正在开发我的第一个Zend Framework 2项目。我在我的项目中实现了ZfcUser,因为我的数据库表中的列略有不同,我想从ZfcUser覆盖User Mapper。我已经通过互联网搜索了这里,但没有得到解决方案。我必须承认我找到的解决方案是从2012年开始的(ZF2: Custom user mapper for ZfcUser module),所以在此期间可能会发生一些变化。

所以到目前为止我做了什么。我创建了自己的用户实体。如果我理解正确,那么它需要扩展我所做的ZfcUser:

模块/应用/ SRC /实体/ user.php的     

namespace Application\Entity;
use Doctrine\ORM\Mapping as ORM;
use ZfcUser\Entity\User as ZfcUser;

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 */
 class User extends ZfcUser
 {

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
 protected $id;

/**
 * @var string
 *
 * @ORM\Column(name="username", type="string", length=255, nullable=false)
 */
 protected $username;

然后我复制了zfcuser.global.php并将其移到了文件夹config / autoload / zfcuser.global.php

在此文件中,我已激活'user_entity_class'=> “应用程序\实体\用户”, 我希望到目前为止这是正确的。

现在我需要自己的UserMapper。据我所知,这不能通过配置文件完成。我将文件夹“Mapper”及其所有文件从zfc-user / src / ZfcUser / Mapper复制到我的应用程序模块中。我从所有文件中更改了命名空间。现在我很困惑我还需要复制什么,服务和/或工厂文件夹?在哪里以及如何告诉我的应用程序使用我自己的Mapper而不是ZfcUser?我只是不明白,希望有人能给我一些帮助。非常感谢你提前!

2 个答案:

答案 0 :(得分:0)

ZfcUser只是向服务管理器询问UserMapper的实例。他们使用的别名称为'zfcuser_user_mapper'。

因此,如果您将该别名链接到您自己的UserMapper,那么您应该很高兴。 您可以在模块的module.config.php文件中设置它,即:

'service_manager' => array(

        'invokables' => array(
            'MyModule\Mapper\UserMapper' => 'MyModule\Mapper\UserMapper',
        ),

        'aliases' => array(
            'zfcuser_user_mapper' => 'MyModule\Mapper\UserMapper',
        ),
),

或者您也可以在getServiceConfig()中的Module.php中进行设置。

确保在application.config.php中的ZfcUser之后加载自己的模块。

请注意,我没有对此进行过测试,但从理论上说它应该可行。

编辑(2014/09/24) 由于您收到错误消息名称为“zfcuserusermapper”或“zfcuser_user_mapper”的别名已存在,请尝试直接在您自己的模块中覆盖工厂。在您自己的模块的module.config.php中:

'service_manager' => array(
    'factories' => array(
        // Override ZfcUser User Mapper factory
        'zfcuser_user_mapper' => function ($sm) {
            $options = $sm->get('zfcuser_module_options');
            $mapper = new MyModule\Mapper\User($sm->get('Zend\Db\Adapter\Adapter'));
            $entityClass = $options->getUserEntityClass();
            $mapper->setHydrator(new ZfcUser\Mapper\UserHydrator());
            $mapper->setTableName($options->getTableName());
            return $mapper;
        },
    )
),

答案 1 :(得分:0)

谢谢Ruben和他的建议。我不得不稍微改变它以使其工作,因为我使用的是最新的Zend Framework 2.

我将在此处描述我的错误消息和解决方案,以防万一其他人将面临同样的问题。

<强> module.php

// This solution did not work for me
public function getServiceConfig()
{
    return array(
      'service_manager' => array(
         'factories' => array(
          // Override ZfcUser User Mapper factory
          'zfcuser_user_mapper' => function ($sm) {
              $options = $sm->get('zfcuser_module_options');
              $mapper = new MyModule\Mapper\User($sm->get('Zend\Db\Adapter\Adapter'));
              $entityClass = $options->getUserEntityClass();
              $mapper->setHydrator(new ZfcUser\Mapper\UserHydrator());
              $mapper->setTableName($options->getTableName());
              return $mapper;
           },
        )
     );     
} 

首先,我必须删除&#39; service_manager&#39; =&GT; array(),否则代码完全被忽略,并使用了普通的ZfcUser。删除后我收到3条错误消息。

<强> 1。可捕获致命错误:传递给ZfcUser \ Mapper \ UserHydrator :: __ construct()的参数1必须是Zend \ Crypt \ Password \ PasswordInterface的实例,没有给出,

修复它,我不得不改变它:

 $mapper->setHydrator(new ZfcUser\Mapper\UserHydrator());

到此代码:

 $mapper->setHydrator($sm->get('zfcuser_user_hydrator'));

之后我收到了下一条错误消息:

<强> 2。没有数据库适配器

再一些代码需要改变:

 $mapper = new MyModule\Mapper\User($sm->get('Zend\Db\Adapter\Adapter'));

进入这个

 $mapper = new \ZfcUserExtension\Mapper\User();                   
 $mapper->setDbAdapter($sm->get('zfcuser_zend_db_adapter'));

最后一条错误消息

<强> 3。没有实体原型设置

当我添加以下行时,此消息消失了:

$mapper->setEntityPrototype(new $entityClass);

现在是最终的工作代码:

public function getServiceConfig()
{
    return array(
            'factories' => array(
                    'zfcuser_user_mapper' => function ($sm) {
                        $options = $sm->get('zfcuser_module_options');
                        $mapper = new \ZfcUserExtension\Mapper\User();
                        // No db adapter present add below line
                        $mapper->setDbAdapter($sm->get('zfcuser_zend_db_adapter'));
                        $entityClass = $options->getUserEntityClass();
                        // No entity prototype set add below line
                        $mapper->setEntityPrototype(new $entityClass);
                        $mapper->setHydrator($sm->get('zfcuser_user_hydrator'));
                        $mapper->setTableName($options->getTableName());
                        return $mapper;
                    },
                )
            );  
}

我最终将ZfcUser中的Mapper和Entity文件夹复制到名为ZfcUserExtension的模型中。然后我在UserMapper中将数据库列名从user_id更改为id。我现在可以登录并注册新的列名。

不幸的是我还无法使用更改密码,因为它仍在使用user_id,我还没有找到设置的位置以及如何覆盖它,但我会更新发布时,我找到了解决方案。如果有人知道这个问题的解决方案,那么请随时分享。

非常感谢@Ruben的帮助!!