zend-framework2 - ZF2 中的 Controller 覆盖

标签 zend-framework2

我是 Zend Framework 2 的新手。我正在启动一个项目,我希望它的安全性由 ZfcAdmin、ZfcUser、ZfcUserAdmin 和 BjyAuthorize 管理。我要做的第一件事是修改创建用户的过程。我希望能够在创建新用户后立即为其分配角色。

我面临的第一个问题是创建用户时, Controller 将我重定向到用户的列表页面。我需要改变这种行为,我想被重定向到编辑页面,在那里我可以为最近创建的用户选择 N 个角色(这将是与实体的另一场 war ......)。我选择了覆盖 UserAdminController (ZfcUserAdmin)。这就是我为实现这一目标所做的事情:

1. 我在 application.config.php 的最后一个位置加载了我的管理模块 (MyAdministration),
为了能够覆盖其他模块的属性。

2. 我在 MyAdministration/config/module.config.php 中覆盖 ZfcUserAdmin Controller 以使用我的:

(...)
'controllers' => array(
    'invokables' => array(
        'zfcuseradmin' => 'MyAdministration\Controller\MyAdministrationController',
    ),
),
(...)

3. 我已经创建了类(class)
MyAdministration/src/MyAdministration/Controller/MyAdministrationController.php

4. 我已经声明它扩展了 ZfcUserAdmin 之一
namespace Administracion\Controller;
(...)
use ZfcUserAdmin\Controller\UserAdminController;

class AdministracionController extends UserAdminController {
(...)

5. 我已经重写了 createAction 函数以重定向到编辑页面
(...)
public function createAction() {
(...)
return $this->redirect()->toRoute('zfcadmin/zfcuseradmin/edit/:userId', 
    array('userId' => $user->getId()));
}
(...)

这就是我不知道我是否做得对的地方。
搜索网络和调试我了解到有一个名为 InjectTemplateListener 的类,它将 Controller 的命名空间转换为所需模板的路径。我的 Controller “被翻译”为
我的管理/我的管理/编辑 这导致无处可去,模板属于 ZfcUserAdmin 模块。正确的路径是其 Controller 获得的路径(ZfcUserAdmin\Controller\UserAdminController):
zfc-user-admin/user-admin/编辑

我还了解到模板路径可以手动编写。这些路径被忽略
注入(inject)模板监听器。这就是我使用的方法。在
MyAdministration/config/module.config.php 我写过:
(...)
'view_manager' => array( 
    'template_map' => array(
        'my-administration/my-administration/list' => __DIR__ . '/../../../vendor/ZfcUserAdmin/view/zfc-user-admin/user-admin/list.phtml',
        'my-administration/my-administration/create' => __DIR__ . '/../../../vendor/ZfcUserAdmin/view/zfc-user-admin/user-admin/create.phtml',
        'my-administration/my-administration/edit' => __DIR__ . '/../../../vendor/ZfcUserAdmin/view/zfc-user-admin/user-admin/edit.phtml',
        'my-administration/my-administration/pagination_userlist' => __DIR__ . '/../../../vendor/ZfcUserAdmin/view/zfc-user-admin/user-admin/pagination_userlist.phtml',
    ),
    (...) 
),

我不确定这是否是实现这一目标的最佳方式。我觉得必须有更好的方法来做到这一点,而不是手动编写模板路径。我发现一些关于覆盖的事情
Controller ,没有例子……这样可以吗?有没有人有更好的方法来做覆盖?

谢谢!

最佳答案

您是正确的,模板名称可以由监听器注入(inject)。那是在这个单一的条件下:如果没有设置模板名称。

因此,对于此操作,注入(inject)模板监听器会注入(inject)模板名称:

namespace MyModule;

class MyController
{
  public function myAction()
  {
    return new ViewModel;
  }
}

模板为 my-module/my-controller/my-action .但是,如果您设置模板,则将跳过监听器:
namespace MyModule;

class MyController
{
  public function myAction()
  {
    $view = new ViewModel;
    $view->setTemplate('another-module/my-controller/my-action');

    return $view;
  }
}

您可以在 Controller 中看到您正在覆盖 returned data with the form is a simple array and not even a view model .重定向插件返回一个 Response 对象。

因此,您检查返回值是否为数组,如果是,则设置模板 明确 .这会跳过监听器以注入(inject)模板名称:
namespace MyAdminModule;

use ZfcUserAdmin\Controller\UserAdminController as BaseUserAdminController;

use Zend\View\Model\ViewModel;
use Zend\Http\Response;

class UserAdminController extends BaseUserAdminController
{
    public function createAction()
    {
        $result = parent::createAction();

        if ($result instanceof Response) {
            // Old behaviour
            return $this->redirect()->toRoute('zfcadmin/zfcuseradmin/edit/:userId', 
                                              array('userId' => $user->getId()));
        }

        // $result is array
        $view = new ViewModel;
        $view->setVariables($result);
        $view->setTemplate('zfc-user-admin/user-admin/create');

        return $view;
    }
}

因为您现在直接设置模板名称,所以您可以跳过在配置中对模板映射的操作。这也增强了灵 active ,因为您使用模块外部的路径对模板路径进行了硬编码。您现在还可以选择在另一个模块中覆盖 zfcUserAdmin 模板映射。

关于zend-framework2 - ZF2 中的 Controller 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14076351/

相关文章:

php - ZF2 依赖注入(inject)别名和多个实例

php - 我们需要在 Zend 框架 2 中使用 mysql_close() 吗?

mysql - 在 zf2 查询中使用 union 选择五个以上的表

ide - Sublime Text 2 和 ZF2 ... 自动完成不起作用

php - Zend Framework 2 从模块添加导航项

forms - 向 zf2 表单元素标签添加所需的后缀

php - 有没有办法在本地覆盖 ZF2 application.config.php 指令?

php - baseUrl View 助手不适用于 ZendFramework 2

php - 在哪里保存多个 ZF2 模块中使用的类?