我想通过处理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获取模块/控制器名称中的控制器可调用名称。怎么样?
答案 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">
......瞧......
如果有人可以提出更精简和更清洁的解决方案,那就太好了:)