Vijay Choudhary
Vijay Choudhary

Reputation: 848

zend framework 2 add new controller

In which files do we need to make changes in order to add a new controller in Module and call it through URL.

Is there a way in which we add a new controller file and call it through url without changing any other configuration files.

As it will be very tedious to make changes in configuration files on every add or edit in controller files.

Upvotes: 6

Views: 12596

Answers (3)

Mr Coder
Mr Coder

Reputation: 8186

From Zend Framework 2 reference

We inform the application about controllers we expect to have in the application. This is to prevent somebody requesting any service the ServiceManager knows about in an attempt to break the application. The dispatcher uses a special, scoped container that will only pull controllers that are specifically registered with it, either as invokable classes or via factories.

src : http://framework.zend.com/manual/2.0/en/modules/zend.mvc.quick-start.html#create-a-route

Adding the controllers is not related to routing, except tangentially due to developers wanting to be able to specify the controller in the URL. It's a security issue, due to the fact that we treat controllers as services.

This is an effort (a) to be explicit about what controllers are available, and (b) to be secure by default.

As sayed by Matthew Weier O'Phinney .

Upvotes: -1

user1815615
user1815615

Reputation: 131

I am adding a little clarification to what Daniel said on "make sure you've got a matching route that satisfies your purpose...". For my purpose I was trying to accommodate routes to module/Application/src/Application/Controller/IndexController.php and module/Application/src/Application/Controller/ProfileController.php, however I struggled to resolve anything to my ProfileController. It was also not clear if ZF2 could accommodate multiple Controllers in a single module. I thought surely it must and it does! Given the two above controllers this is how I crafted my 'router' array inside module/Application/config/module.config.php.

'router' => array(
    'routes' => array(
        'home' => array(
            'type' => 'Zend\Mvc\Router\Http\Literal',
            'options' => array(
                'route'    => '/',
                'defaults' => array(
                    'controller' => 'Application\Controller\Index',
                    'action'     => 'index',
                ),
            ),
        ),
        'application' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/application',
                'defaults' => array(
                    '__NAMESPACE__' => 'Application\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                '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(
                        ),
                    ),
                ),
            ),
        ),

        'profile' => array(
            'type' => 'literal',
            'options' => array(
                'route' => '/profile',
                'defaults' => array(
                    '__NAMESPACE__' => 'Application\Controller',
                    'controller'    => 'Profile',
                    'action'        => 'index',
                ),
            ),
        ),
    ),
),

Also this is what my 'controllers' invokables looks like in modules.config.php following success.

'controllers' => array(
    'invokables' => array(
        'Application\Controller\Index' => 'Application\Controller\IndexController',
        'Application\Controller\Profile' => 'Application\Controller\ProfileController'
    ),
),

Upvotes: 9

Daniel M
Daniel M

Reputation: 3379

To create a new controller, you have at least to

  • create the controller class
  • make sure you've got a matching route that satisfies your purpose (you can take existing ones as well as create a new one for special purposes)
  • create a controllers.invokables entry in your module's module.config.php.

There's no way around these three simple steps. I don't see why it should be a problem to adapt the module.config.php when you add a controller -- that's what config files are for. Including opening, saving und closing, this takes approx. 10-15 seconds. You aren't going to create hundreds of controllers, are you?

Upvotes: 4

Related Questions