Zend Framework 2路由和设置路由的默认“模块”,“控制器”,“动作”

时间:2014-01-31 20:26:36

标签: routing zend-framework2

我正在使用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'));

1 个答案:

答案 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();

  //...             
}

检索RouteMatch和路由器对象

在路由匹配时,路由器类在内部创建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本书。