我是Zend Framework 2的新手。我正在启动一个项目,我希望它的安全性由ZfcAdmin,ZfcUser,ZfcUserAdmin和BjyAuthorize管理。我要做的第一件事是修改创建用户的过程。我希望能够在创建新用户后立即将其分配给新用户。
我面临的第一个问题是创建用户时,控制器会将我重定向到用户的列表页面。我需要改变这种行为,我希望被重定向到编辑页面,在那里我将能够为最近创建的用户选择N个角色(这将是与实体的另一场战争......)。我已经选择覆盖UserAdminController(ZfcUserAdmin)。这就是我为实现这一目标所做的:
1。我在 application.config.php 的最后一处加载了我的管理模块(MyAdministration), 为了能够覆盖其他模块的属性。
2. 我在 MyAdministration / config / module.config.php 中重写ZfcUserAdmin控制器以使用我的:
(...)
'controllers' => array(
'invokables' => array(
'zfcuseradmin' => 'MyAdministration\Controller\MyAdministrationController',
),
),
(...)
3。我已经创建了这个类 本届政府/ SRC /本届政府/控制器/ 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的命名空间转换为所需模板的路径。我的控制器'被翻译'到 my-administration / my-administration / edit 无处可去,模板属于ZfcUserAdmin模块。正确的路径是由其控制器(ZfcUserAdmin \ Controller \ UserAdminController)获得的路径: 的 ZFC用户管理员/用户管理/修改
我还了解到模板路径可以手动编写。那些路径被忽略了 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',
),
(...)
),
我不确定这是否是实现这一目标的最佳方法。我觉得必须有更好的方法,而不是手动编写模板路径。我发现很少有关于重写的事情 控制器,没有例子......这样可以吗?有没有人有更好的方法来做最重要的事情?
谢谢!
答案 0 :(得分:3)
你是正确的,模板名称可以由监听器注入。这是在这一个条件下:如果没有设置模板名称。
因此,对于此操作,注入模板侦听器会注入模板名称:
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;
}
}
您可以在控制器中看到覆盖returned data with the form is a simple array and not even a view model。重定向插件返回一个Response对象。
因此,您检查返回值是否为数组,如果是,则设置模板显式。这会跳过侦听器以注入模板名称:
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;
}
}
由于您现在直接设置模板名称,因此可以跳过对配置中模板映射的操作。这也增强了灵活性,因为您使用模块外部的路径对模板路径进行了硬编码。您现在还可以选择覆盖另一个模块中的zfcUserAdmin模板映射。