phpzend-frameworkzend-framework-mvczend-framework2

ZF2 - Get controller name into layout/views


I know with ZF1 you would retrieve the module/controller name using custom View Helpers that would get the singleton frontController object and get the name there.

Using ZF2 as they've abolished alot of the singleton nature of the framework and introduced DI where I've specified aliases for all of my controllers within this module... I can imagine I would get it through accessing the DI or perhaps injecting the current name into the layout.

Anyone got any idea how you would do it. I guess there a hundred different ways but after sniffing about the code for a few hours I can't really figure out how its meant to be done now.

The reason I wanted the controller name is to add it to the body as a class for specific controller styling.

Thanks, Dom


Solution

  • ZF2 is out and so is the skeleton. This is adding on top of the skeleton so it should be your best example:

    Inside Module.php

    public function onBootstrap($e)
    {
        $e->getApplication()->getServiceManager()->get('translator');
        $e->getApplication()->getServiceManager()->get('viewhelpermanager')->setFactory('controllerName', function($sm) use ($e) {
            $viewHelper = new View\Helper\ControllerName($e->getRouteMatch());
            return $viewHelper;
        });
    
        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);
    }
    

    The actual ViewHelper:

    // Application/View/Helper/ControllerName.php
    
    namespace Application\View\Helper;
    
    use Zend\View\Helper\AbstractHelper;
    
    class ControllerName extends AbstractHelper
    {
    
    protected $routeMatch;
    
        public function __construct($routeMatch)
        {
            $this->routeMatch = $routeMatch;
        }
    
        public function __invoke()
        {
            if ($this->routeMatch) {
                $controller = $this->routeMatch->getParam('controller', 'index');
                return $controller;
            }
        }
    }
    

    Inside any of your views/layouts

    echo $this->controllerName()