Search code examples
phpzend-frameworkzend-framework2zend-studiozend-server

Having trouble with URI routing for modules in Zend Framework


I'm just starting off with Zend Framework, and I'm not quite sure what I'm doing wrong with the URI routing.

I'm starting with an initial Zend Framework project in Zend Studio based in my htdocs folder (I'm using Zend Server as well on Windows 7). Everything up to there seems to be working fine getting the index page up (it's running out of the /public/ subdirectory).

But when I try to add a module though, in this case called Users with a controller called Index, and following the instructions in getting that configured, I'm not sure what I should be putting in the URI to get it to route to it's view. I've tried just about every configuration of URI combinations that I can think of (localhost:80/public/users, localhost:80/public/users/index, localhost:80/users, etc)

I'm not getting a routing error, but just a plain 404 page.

Do I need to set the public folder as the root? Or is there something else I need to do to get the routing to work?

~edit in response to bitWorking

It looks like it does automatically add it to the application.config.php. But here is the module.config.php of the Users module

'router' => array(
    'routes' => array(
        'users' => array(
            'type'    => 'Literal',
            'options' => array(
                // Change this to something specific to your module
                'route'    => '/index',
                'defaults' => array(
                    // Change this value to reflect the namespace in which
                    // the controllers for your module are found
                    '__NAMESPACE__' => 'Users\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                // This route is a sane default when developing a module;
                // as you solidify the routes for your module, however,
                // you may want to remove it and replace it with more
                // specific routes.
                'default' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '/[:controller[/:action]]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                        ),
                    ),
                ),
            ),
        ),
    ),
),

Now I do see where it's guiding you to customize the routes. I've experimented with this as well, but still am not sure what I should set them to. Much closer though.


Solution

  • If you want to call the Index controller in your Users module with /users you have to name the route accordingly:

    ...
    'users' => array(
        'type'    => 'Literal',
        'options' => array(
            // Change this to something specific to your module
            'route'    => '/users',
                          ---------
            ...
    

    Else please control the application.config.php. It should look like:

    return array(
        'modules' => array(
            'Application',
            'Users',
        ),
        ...
    

    So the Url's should look like:

    localhost/public/users -> Users/Controller/IndexController/indexAction
    localhost/public/users/foo -> Users/Controller/FooController/indexAction
    localhost/public/users/foo/bar -> Users/Controller/FooController/barAction