0
votes

I'm writing my custom router for a Zend Framework 2 project extending Zend\Mvc\Router\RouteInterface. The routes should come from a database (large project with hundreds of pages). A working Router obviously only needs two methods: match() and assemble(). The match one I got working alright.

But what about assemble()? What should this method return? Could it be it only returns the base path of the Application?

Here is what one of the internal routers (Zend\Mvc\Router\SimpleRouteStack) of ZF2 does:

/**
 * 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);
}

Reference: Custom Routing in Zend Framework 2

1

1 Answers

1
votes

Basically assemble is what would be call when you do things like $this->redirect-toRoute($name, $params);

so it should return a URL string based on the route config. that the route can match using the same route config.

When you call toRoute the routestack that you posted finds the route with the name you specified in the call and then asks it to assemble the URL to that route

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

this route named 'test' when we call $this->redirect-toRoute('test', array('id' => 1)); the route stack will find the instantiated route for 'test', this is a \Zend\Mvc\Router\Http\Segment and then calls it assemble function which will take the params send with in the call to toRoute and it will yield a URL string like this

/test/1

and that's basically what the assemble function does.