通过post vars进行ZF2路由

时间:2013-11-23 17:02:41

标签: routing zend-framework2

我想通过处理http post vars来路由请求,例如通过在表单中​​输入“模块”,“控制器”,“动作”等,将表单的action =“...”目标设置为应用程序的默认路由,并从那里路由到模块/控制器/行动路线。 URL /模块/控制器/操作不能访问模块/控制器/操作的路由,因此问题是,如果在module.config.php中配置了路由,那么它们也可以通过URL访问吗? 我可能在那里错过了一点,它可能简单明了,只要我知道module.config.php中路由的正确配置,或者是否需要设置自己的自定义路由服务?

路由重定向会在浏览器的地址栏中显示路由URL,这就是我想要避免的,并且不知道如何。

if ($this->request->isPost()) {
    $post = $this->request->getPost();
    if (isset($post->module) && isset($post->controller) && isset($post->action)) {
        return $this->redirect()->toRoute($post->module, array(
            'controller' => $post->controller,
            'action' =>  $post->action
        ));
    } 
}
编辑:找到半个解决方案: 使用\ Mvc \ Controller \ Plugin \ Forward,如下所示:

在应用程序的默认控制器/操作中,按照module.config.php中invokables部分中定义的名称调用控制器,例如:对于名为“register”的控制器:

if ($this->request->isPost()) {
    $post = $this->request->getPost();
    if (isset($post->module) && isset($post->controller) && isset($post->action)) {
        return $this->forward()->dispatch('register', array('action' => $post->action));
    } 
}

现在我需要从post vars获取模块/控制器名称中的控制器可调用名称。怎么样?

1 个答案:

答案 0 :(得分:0)

解决方案的关键是在模块的module.config.php中定义唯一的控制器可调用名称,其方式是可以以结构化定义的方式构造控制器可调用名称,例如使用语法“MyModule \ Controller” \ MyController“for invokables。

示例应用程序:

模块/控制器:

  • 应用
    • 索引
  • 用户
    • 索引
    • 登录
    • 注册

文件模块中的代码/ Application / config / module.config.php: (注意:应用程序模块的路由仍然存在,因此我们仍然可以通过URL路由获得一些页面,即我们希望搜索引擎可以访问的页面。 如果我们想要摆脱这些,那么我们必须设置路由以键入'Hostname',如zf2 website with a single entry-point, no routes/paths in URL中所述。)

return array(
    'controllers' => array(
        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController',
        ),
    ),

    'router' => array(
        'routes' => array(
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Application\Controller',
                        'controller'    => 'Index',
                        'action'        => 'index',
                    ),
                ),
            ),
            'application' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/application',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Application\Controller',
                        'controller'    => 'Index',
                        'action'        => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'default' => array(
                        'type'    => 'Segment',
                        'options' => array(
                            'route'    => '/[:controller[/:action]]',
                            'constraints' => array(
                                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                            ),
                            'defaults' => array(
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),

如果我们想在模块Application中禁止URL路由,那么文件模块/ Application / config / module.config.php中的路由应该这样定义:

'router' => array(
    'routes' => array(
        'home' => array(
            'type' => 'Hostname',
            'options' => array(
                'route'    => '4yougroup.local.f4u.0101',
                'defaults' => array(
                    '__NAMESPACE__' => 'Application\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            ),
        ),
    ),
),

文件模块中的代码/ User / config / module.config.php: (注意:这里没有定义路线!)

return array(
    'controllers' => array(
        'invokables' => array(
            'User\Controller\Index'     => 'User\Controller\IndexController',
            'User\Controller\Register'  => 'User\Controller\RegisterController',
            'User\Controller\Login'     => 'User\Controller\LoginController',
        ),
    ),

为了使用HTTP POST变量通过应用程序的默认路由路由所有内容,请将此代码放在Application模块的IndexController indexAction函数中:

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        if ($this->request->isPost()) {
            $post = $this->request->getPost();
            if (isset($post->module) && isset($post->controller) && isset($post->action)) {
                $controllerName = ucfirst($post->module) . "\\Controller\\" . ucfirst($post->controller);  

                return $this->forward()->dispatch($controllerName, array('action' =>  $post->action));
            } 
        }
    }
}

然后将HTML代码放在视图中:

<form class="form-horizontal" action="" method="POST">
    <input type="hidden" name="module" value="user">
    <input type="hidden" name="controller" value="register">
    <input type="hidden" name="action" value="index">

......瞧......

如果有人可以提出更精简和更清洁的解决方案,那就太好了:)