6

嗨,我正在尝试使用 Zend Framwork 2 的 ZfcUser 模块编写用户注册表单,并希望在添加更多用户字段时获得有关最佳实践的一些建议。

到目前为止,我已经创建了自己的名为“WbxUser”的模块,并且如模块 wiki 页面中所述, 我通过在我的模块引导函数中使用事件管理器向 ZfcUser 的注册表单添加了一个名为“userlastname”的自定义字段,如下所示。

代码:

//WbxUser.Module.php   

namespace WbxUser;

use Zend\Mvc\MvcEvent;


class Module {
    public function onBootstrap(MvcEvent $e){
        $events = $e->getApplication()->getEventManager()->getSharedManager();
        $events->attach('ZfcUser\Form\Register','init', function($e) {
            $form = $e->getTarget();
            $form->add(array(
                    'name' => 'userlastname',
                    'attributes' => array(
                            'type'  => 'text',
                    ),
                    'options' => array(
                            'label' => 'Last Name',
                    ),
            ));
            // Do what you please with the form instance ($form)
        });

        $events->attach('ZfcUser\Form\RegisterFilter','init', function($e) {
            $filter = $e->getTarget();

            $filter->add(array(
                'name'       => 'userlastname',
                'required'   => true,
                'filters'  => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name'    => 'StringLength',
                        'options' => array(
                            'min' => 3,
                            'max' => 255,
                        ),
                    ),
                ),
           ));
        });
    }

    public function getConfig(){
        return array();
    }

    public function getAutoloaderConfig(){
        return array();
    }
}

但是在此之后,我对在哪里/如何编写代码以保存我的新字段正在收集的额外数据有点迷失了。

  1. 这是我可以为其他字段启动保存例程的事件吗? https://github.com/ZF-Commons/ZfcUser/wiki/How-to-perform-a-custom-action-when-a-new-user -帐户已创建

  2. 我是否应该编写自己的 WbxUser 模型来扩展 ZfcUser\Entity\User.php 以添加我的新字段

我有点像 ZF 和 MVC 菜鸟,所以对于写入方向的轻推会非常满意。

4

3 回答 3

4

这个似乎更直观一点

http://juriansluiman.nl/en/article/117/use-3rd-party-modules-in-zend-framework-2

于 2012-12-05T23:50:01.510 回答
1

您可以覆盖模块配置。最优雅的方法是使用 autoload 文件夹中的 zfcuser.global.php.dist。将此文件复制到您的应用程序自动加载文件夹并将文件名更改为 zfcuser.global.php。在这里,您可以更改在这里可以找到的任何选项。此选项可用于覆盖 zfcUser 实体:'user_entity_class' => 'ZfcUser\Entity\User'。

再说一次,您可能会发现自己需要更改配置文件中无法更改的内容。在这种情况下,您可以创建自己的用户模块(您可能只想克隆整个 zfcuser 模块,直到您确定要替换哪些文件。

克隆用户模块(并相应地更改命名空间)后,将您的模块添加到 application.config.php。确保你的模块是在 zfcuser 之后加载的。或者,您可以从配置文件中删除 zfcuser 并将以下内容放入 module.php 中:

public function init($moduleManager)
{
    $moduleManager->loadModule('ZfcUser');
}

现在您可以覆盖 ZfcUser 模块配置。以下代码段可用于覆盖模板文件夹和 UserController。

<?php

// Note most routes are managed in zfcUser config file.
// All settings here either overrides or extend that functionality.

return array(
    'view_manager' => array(
        'template_path_stack' => array(
            // 'zfcuser' => __DIR__ . '/../view',  Override template path           
        ),
        'template_map' => array(
            // You may want to use templates from the original module without having to copy - paste all of them.  
        ),
    ),

    'controllers' => array(
        'invokables' => array(
            // 'zfcuser' => 'YourModule\Controller\IndexController', // Override ZfcUser controller.
        ),
    ),

    'router' => array(
        'routes' => array(
            'zfcuser' => array(
                'type' => 'Literal',
                'priority' => 2500,
                'options' => array(
                    'route' => '/user',
                    'defaults' => array(

                        // Use original ZfcUser controller. 
                        // It may be a good idea to use original code where possible

                        'controller' => 'ZfcUser\Controller\UserController',
                        'action'     => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(

                    'authenticate' => array(
                        'type' => 'Literal',
                        'options' => array(
                            'route' => '/authenticate',
                            'defaults' => array(

                                // Invoke YourModule\Controller\IndexController

                                'controller' => 'zfcuser',
                                'action'     => 'authenticate',
                            ),
                        ),
                    ),           
                ),
            ),
        ),
    ), 
);

您还可以在 module.php 中覆盖 ZfcUser 服务。;-)

于 2013-09-07T14:46:50.753 回答
0

更改第三方模块并没有真正吸引我,因为有时它会扰乱很多功能。我总是尝试在模块之外做一些事情,因为如果模块中有更新,我很容易将其合并到我的应用程序中,而无需重写任何东西。

要执行您尝试执行的操作,我将在我的应用程序中创建另一个表并添加一个扩展 zfcuser 表的外键,这样我就可以将信息与我的应用程序中的每个 zf2user 关联起来。

这只是一个建议,因为我也是 zf2 的新手。

于 2013-07-03T09:47:07.717 回答