Zend framework2 ZF2,什么';这是使用供应商模块&x27;什么形式的课程?

Zend framework2 ZF2,什么';这是使用供应商模块&x27;什么形式的课程?,zend-framework2,Zend Framework2,我应该如何将自定义样式应用于供应商模块的表单或将其嵌入到我自己的视图脚本中? 更具体地说,我希望使用EdpUser模块提供的表单(https://github.com/EvanDotPro/EdpUser) 最简单的方法似乎是直接修改供应商的脚本。但显然,这将与供应商的未来更新相冲突 另一种方法似乎是将供应商的控制器复制到我自己的模块中,然后提供我自己的视图。然而,这也面临着与供应商未来更新不同步的类似问题。我必须小心使用名称空间 也许我应该扩展供应商的控制器,而不是复制它。这应该可以很好地使用

我应该如何将自定义样式应用于供应商模块的表单或将其嵌入到我自己的视图脚本中? 更具体地说,我希望使用EdpUser模块提供的表单(https://github.com/EvanDotPro/EdpUser)

最简单的方法似乎是直接修改供应商的脚本。但显然,这将与供应商的未来更新相冲突

另一种方法似乎是将供应商的控制器复制到我自己的模块中,然后提供我自己的视图。然而,这也面临着与供应商未来更新不同步的类似问题。我必须小心使用名称空间

也许我应该扩展供应商的控制器,而不是复制它。这应该可以很好地使用名称空间,并且我应该能够很容易地访问控制器中的表单。在使用我自己的视图脚本时。这是正确的方法还是有更好的方法


谢谢

建议不要修改模块目录中的任何内容,尤其是放在
/vendor/
中的模块。这也是必须将配置模板复制到您自己的
/config/autoload/
目录的原因

模块必须提供足够的扩展点,以使其足够灵活,适合您的使用。这些可能性包括以下选项:

改道 ZfcUser模块在/user url下注册自身。例如,如果要将其更改为/account,只需将其添加到配置中即可:

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\Mvc\Router\RouteStack' => array(
                'parameters' => array(
                    'routes' => array(
                        'zfcuser' => array(
                            'options' => array(
                                'route' => '/account',
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);
<?php
return array(
    'di' => array(
        'instance' => array(
            'alias' => array(
                'zfcuser' => 'MyUser\Controller\UserController'
            ),
        ),
    ),
);
您还可以使用DI别名覆盖DI配置中的
zfcuser
别名:

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\Mvc\Router\RouteStack' => array(
                'parameters' => array(
                    'routes' => array(
                        'zfcuser' => array(
                            'options' => array(
                                'route' => '/account',
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);
<?php
return array(
    'di' => array(
        'instance' => array(
            'alias' => array(
                'zfcuser' => 'MyUser\Controller\UserController'
            ),
        ),
    ),
);
我想在这里说两句话:

  • 每个模块都必须提供自己的触发器。此ZfcUser在两种形式上都有
    init
    ,但并非每个模块都有此功能。您必须查看文档或源代码才能了解这一点
  • Zend\EventManager
    当前正在进行重构,以通过
    Zend\Di
    定位器实例化的
    SharedEventManager
    实例替换singleton
    StaticEventManager
    。您可以在中查看此重构的进度
  • 更改视图或窗体渲染 根据
    Zend\Form
    组件可能会更改。特别是在渲染时,装饰器将被删除,而“仅”普通视图帮助器将渲染窗体。有了这个条件,再加上覆盖视图的可能性,只需使用另一个模块和一些视图脚本就可以很容易地更改动作的呈现

    如果创建自己的模块并提供此配置,则将向模板路径堆栈添加一个新位置:

    <?php
    return array(
        'di' => array(
            'instance' => array(
                'Zend\View\Resolver\TemplatePathStack' => array(
                    'parameters' => array(
                        'paths' => array(
                            'myuser' => __DIR__ . '/../view',
                        ),
                    ),
                ),
            ),
        ),
    );
    

    我决定继续扩展供应商的控制器。但我很快发现,它不会像我预期的那样工作。供应商的控制器插件“EdpUserAuthentication”加载失败。感谢您的详细回答。Jurian,您的回答刚刚帮助了我-谢谢。这只是对其他人的一个快速补充:视图脚本的覆盖似乎取决于application.config.php中模块的顺序。要覆盖的模块必须放在将覆盖它的模块之前。我想这是有道理的,但我花了一两分钟才弄明白为什么我的视图覆盖不起作用……请注意,在撰写本文时,其中大部分内容已经过时。请参阅-要覆盖UserController,例如,您必须为zfcuser的扩展创建一个新别名,并将其放入配置文件中。zf2模块中的情况仍在快速变化我写了一篇关于这个主题的博客文章,以便能够随着框架中的变化进行更新。是的,上面是我以前的答案,你可以在@JurianSluiman上找到我的博客文章。你知道在添加到ZfcUser输入字段后如何保存表单数据吗?我在这里问了一个问题,想知道你是否能帮我