ZF2 中 Zend\Mvc\Router\RouteInterface::assemble() 的输出应该是什么

What schould be the output of Zend\Mvc\Router\RouteInterface::assemble() in ZF2

我正在为扩展 Zend\Mvc\Router\RouteInterface 的 Zend Framework 2 项目编写自定义路由器。路线应该来自数据库(有数百页的大型项目)。一个工作的 Router 显然只需要两个方法:match()assemble()。我得到的那场比赛还不错。

但是 assemble() 呢? 这个方法应该是什么return?难道它只是return应用程序的基本路径吗?

ZF2 的其中一个内部路由器 (Zend\Mvc\Router\SimpleRouteStack) 的作用如下:

/**
 * assemble(): defined by RouteInterface interface.
 *
 * @see    \Zend\Mvc\Router\RouteInterface::assemble()
 * @param  array $params
 * @param  array $options
 * @return mixed
 * @throws Exception\InvalidArgumentException
 * @throws Exception\RuntimeException
 */
public function assemble(array $params = array(), array $options = array())
{
    if (!isset($options['name'])) {
        throw new Exception\InvalidArgumentException('Missing "name" option');
    }

    $route = $this->routes->get($options['name']);

    if (!$route) {
        throw new Exception\RuntimeException(sprintf('Route with name "%s" not found', $options['name']));
    }

    unset($options['name']);

    return $route->assemble(array_merge($this->defaultParams, $params), $options);
}

参考:Custom Routing in Zend Framework 2

基本上 assemble 就是当您执行 $this->redirect-toRoute($name, $params);

之类的操作时会调用的内容

所以它应该 return 一个基于路由配置的 URL 字符串。该路由可以使用相同的路由配置进行匹配。

当您调用 toRoute 时,您发布的路由堆栈会找到具有您在调用中指定的名称的路由,然后要求它 assemble URL 到该路由

'test' => array(
    'type'    => 'Segment',
    'options' => array(
        'route'    => '/test[/:id]',
        'constraints' => array(
            'id'     => '[a-zA-Z][a-zA-Z0-9_-]*',
        ),
        'defaults' => array(
            '__NAMESPACE__' => 'Application\Controller',
        ),
    ),
),

这个名为'test'的路由当我们调用$this->redirect-toRoute('test', array('id' => 1));时路由栈会找到'test'的实例化路由,这是一个\Zend\Mvc\Router\Http\Segment然后调用它assemble 函数,它将在对 toRoute 的调用中获取参数发送,它将产生一个 URL 字符串,如下所示

/test/1

这基本上就是 assemble 函数的作用。