我正在使用Zend 2 2.2.5和Skeleton Application。我在'TestController.php'中添加了一个简单的'Member'模块。
写“测试”路线的“默认”部分的最佳方法是什么?
之后,如何从匹配的路线中获取“模块”名称?我希望在ZF2中有一个简单的方法来获取'模块','控制器','动作',但不知道如何。
选项1:生成404错误
'defaults' => array(
'module' => 'Member',
'controller' => 'Test',
'action' => 'index',
),
A $matchedRoute->getParam('module'); prints 'Member'
A $matchedRoute->getParam('controller'); prints 'Test'
A $matchedRoute->getParam('action'); prints 'index'
发生404错误页面未找到。 请求的控制器无法映射到现有的控制器类。 控制器:测试(解析为无效的控制器类或别名:测试)
选项2:有效,但“模块”为空
'defaults' => array(
'__NAMESPACE__' => 'Member\Controller',
'controller' => 'Test',
'action' => 'index',
),
A $matchedRoute->getParam('module'); prints '' <= EMPTY
A $matchedRoute->getParam('controller'); prints 'Test'
A $matchedRoute->getParam('action'); prints 'index'
选项3:有效,但“模块”为空
'defaults' => array(
'controller' => 'Member\Controller\Test',
'action' => 'index',
),
A $matchedRoute->getParam('module'); prints '' <= EMPTY
A $matchedRoute->getParam('controller'); prints 'Member\Controller\Test'
A $matchedRoute->getParam('action'); prints 'index'
我尝试使用以下代码在onBootstrap()中获取'module','controller','action':
$sm = $application->getServiceManager();
$router = $sm->get('router');
$request = $sm->get('request');
$matchedRoute = $router->match($request);
print($matchedRoute->getParam('module'));
print($matchedRoute->getParam('controller'));
print($matchedRoute->getParam('action'));
答案 0 :(得分:4)
您通常会为行动添加路线,如下所示:
'test' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/test',
'defaults' => array(
'module' => '__NAMESPACE__',
'controller' => '__NAMESPACE__\Controller\Test',
'action' => 'index',
),
),
),
要使__NAMESPACE__
保持不变,请将以下行添加到模块配置的开头:
namespace Member;
在路由匹配时,路由器(顶级路由类)返回
一些参数:&#34;默认&#34; (defaults
部分列出的参数
路由配置)以及从URL字符串中提取的任何通配符参数。
要从控制器的操作方法中的路径中检索参数,
您通常使用Params
控制器插件及其fromRoute()
方法,
它有两个参数:要检索的参数的名称和值
如果参数不存在则返回。
fromRoute()
方法也可用于一次检索所有参数作为数组。
为此,请在不带参数的情况下调用fromRoute()
,如下例所示:
// An example action.
public function indexAction() {
// Get the single 'id' parameter from route.
$id = $this->params()->fromRoute('id', -1);
// Get all route parameters at once as an array.
$params = $this->params()->fromRoute();
//...
}
在路由匹配时,路由器类在内部创建Zend\Mvc\Router\RouteMatch
类的实例,
提供用于提取匹配的路线名称和从路线提取的参数的方法。
要从控制器的操作方法中获取RouteMatch
对象,您可以使用以下内容
代码:
// An example action.
public function indexAction() {
// Get the RouteMatch object.
$routeMatch = $this->getEvent()->getRouteMatch();
// Get matched route's name.
$routeName = $routeMatch->getMatchedRouteName();
// Get all route parameters at once as an array.
$params = $routeMatch->getParams();
//...
}
有关ZF2路由的其他信息,我建议您阅读Using Zend Framework 2本书。