Welcome to Abdul Malik Ikhsan's Blog

Programmatically add route in zend-mvc application

Posted in Tutorial PHP, Zend Framework 3 by samsonasik on June 16, 2019

Yes, we usually setup routing via configuration in our module.config.php in our modules. However, in very specific condition, we may need to programmatically setting it. There is a ‘Router’ service for that, it represent Zend\Router\Http\TreeRouteStack instance and we can use addRoute() method against it.

For example, we need to setting it in Module::onBootstrap(), so we can code like the following:

namespace Application;

use Zend\Mvc\MvcEvent;
use Zend\Router\Http\Literal;

class Module
    public function onBootstrap(MvcEvent $e)
        // if ( ... condition to be handled programmatically ... ) :

            $services = $e->getApplication()->getServiceManager();
            $router   = $services->get('Router');

            $route = Literal::factory([
                'route' => '/foo',
                'defaults' => [
                    'controller' => Controller\FooController::class,
                    'action'     => 'index',
            $router->addRoute('foo', $route);

        // end if    

    public function getConfig() { /* ... */ }

That’s it!

2 Responses

Subscribe to comments with RSS.

  1. David said, on June 17, 2019 at 8:31 pm

    Interesting, but I’m trying to imagine a case where you would want to do this, and what the advantage would be. The route does not persist beyond the lifetime of the request cycle, right?

    • samsonasik said, on June 18, 2019 at 10:17 am

      For example, you have a specific session to allow/not allow to know that specific page exists.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: