我是 Zend Framework 2 的新手。我正在启动一个项目,我希望它的安全性由 ZfcAdmin、ZfcUser、ZfcUserAdmin 和 BjyAuthorize 管理。我要做的第一件事是修改创建用户的过程。我希望能够在创建新用户后立即为其分配角色。
我面临的第一个问题是创建用户时,控制器将我重定向到用户的列表页面。我需要改变这种行为,我想被重定向到编辑页面,在那里我可以为最近创建的用户选择 N 个角色(这将是与实体的另一场战争......)。我选择了覆盖 UserAdminController (ZfcUserAdmin)。这就是我为实现这一目标所做的事情:
1.我将管理模块 (MyAdministration) 加载到application.config.php的最后一个位置,以便能够覆盖其他模块的属性。
2.我在MyAdministration/config/module.config.php中覆盖 ZfcUserAdmin 控制器以使用我的:
(...)
'controllers' => array(
'invokables' => array(
'zfcuseradmin' => 'MyAdministration\Controller\MyAdministrationController',
),
),
(...)
3.我创建了 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 的类,它将控制器的命名空间转换为所需模板的路径。我的控制器“被翻译”为 my-administration/my-administration/edit导致无处可去,模板属于 ZfcUserAdmin 模块。正确的路径是它的控制器获得的路径(ZfcUserAdmin\Controller\UserAdminController): zfc-user-admin/user-admin/edit
我还了解到模板路径可以手动编写。InjectTemplateListener 会忽略这些路径。这就是我使用的方法。在 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',
),
(...)
),
我不确定这是否是实现这一目标的最佳方式。我觉得必须有更好的方法来做到这一点,而不是手动编写模板路径。我发现很少有关于覆盖控制器的东西,也没有例子……这样可以吗?有没有人有更好的方法来做覆盖?
谢谢!