Advanced Routing


#1

I want to achieve this kind of routing:

ParentRouteController
GET domain.com/parent-route
GET domain.com/parent-route/:value
POST domain.com/parent-route
UPDATE domain.com/parent-route/:value

ChildRoute1Controller
GET domain.com/parent-route/:value/child-route-1
GET domain.com/parent-route/:value/child-route-1/:child1value
POST domain.com/parent-route/:value/child-route-1
UPDATE domain.com/parent-route/:value/child-route-1/:child1value

ChildRoute2Controller
GET domain.com/parent-route/:value/child-route-1/:child1value/child-route-2
GET domain.com/parent-route/:value/child-route-1/:child1value/child-route-2/:childRoute2Value
POST domain.com/parent-route/:value/child-route-1/:child1value/child-route-2
UPDATE domain.com/parent-route/:value/child-route-1/:child1value/child-route-2/:childRoute2Value

I’m using ZF 2.5.2, thanks!


#2

Seems quite straightforward: besides the HTTP method (which will probably be your leaf route), it is nested child routes.

What did you try so far?


#3

I tried something like this:

<?php
return [
    'router' => [
        'routes' => [
            'parent-route' => [
                'type' => 'segment',
                'options' => [
                    'route' => '/parent-route[/:id]',
                    'defaults' => [
                        'controller' => 'MyModule\Controller\Rest\First',
                    ],
                ],
            ],
            'may_terminate' => false,
            'child_routes' => [
                'child-route-1' => [
                    'type' => 'segment',
                    'options' => [
                        'route' => '/parent-route[/:id]/child-route-1[/:child_route1_id]]',
                        'defaults' => [
                            'controller' => 'MyModule\Controller\Rest\Second',
                        ],
                    ],
                    'may_terminate' => false,
                    'child_routes' => [
                        'child-route-2' => [
                            'type' => 'segment',
                            'options' => [
                                'route' => '/parent-route[/:id]/child-route-1[/:child_route1_id]/child-route-2[/:child_route2_id]]',
                                'defaults' => [
                                    'controller' => 'MyModule\Controller\Rest\Third',
                                ],
                            ],
                        ],
                    ]
                ],
            ]
        ],
    ],
    'controllers' => [
        'invokables' => [
            'MyModule\Controller\Rest\First'  => 'MyModule\Controller\Rest\FirstController',
            'MyModule\Controller\Rest\Second' => 'MyModule\Controller\Rest\SecondController',
            'MyModule\Controller\Rest\Third'  => 'MyModule\Controller\Rest\ThirdController'
        ],
    ],
];

When i accessed the route:

domain.com/parent-route/123/child-route-1/456

It goes to the SecondController::getList() function of my Rest Controller instead of SecondController::get($value).


#4

Check the nesting of those arrays: your second route doesn’t seem to be under the first one. Alao, the optional bits (like [/:id]) can’t work like that, as they can ambiguously match either an ID or a child route.


#5

Thanks @ocramius,

I finally figured it out. The :id was ambiguous and needs to be unique for the parent and child routes.