Pregunta

Sé que con ZF1 recuperaría el nombre del módulo/controlador utilizando los ayudantes de vista personalizado que obtendrían el objeto Singleton FrontController y obtendrían el nombre allí.

Usando ZF2, ya que han abolido mucho de la naturaleza singleton del marco e introdujeron DI, donde he especificado alias para todos mis controladores dentro de este módulo ... Me imagino que lo obtendría acceder al DI o tal vez inyectar el Nombre actual en el diseño.

Cualquiera tiene idea de cómo lo harías. Supongo que hay cien maneras diferentes, pero después de oler el código durante unas horas, realmente no puedo entender cómo debe hacerse ahora.

La razón por la que quería el nombre del controlador es agregarlo al cuerpo como clase para el estilo de controlador específico.

Gracias Dom

¿Fue útil?

Solución

ZF2 está fuera y también el esqueleto. Esto está agregando en la parte superior del esqueleto, por lo que debería ser su mejor ejemplo:

Módulo interno.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);
}

El Real 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;
        }
    }
}

Dentro de cualquiera de sus vistas/diseños

echo $this->controllerName()

Otros consejos

Esta sería una solución que tuve que trabajar con ZF2 Beta5

módulo/mymodule/módulo.php

namespace MyModule;

use Zend\Mvc\ModuleRouteListener;
use MyModule\View\Helper as MyViewHelper;

class Module
{
    public function onBootstrap($e)
    {
        $app = $e->getApplication();
        $serviceManager = $app->getServiceManager();

        $serviceManager->get('viewhelpermanager')->setFactory('myviewalias', function($sm) use ($e) {
            return new MyViewHelper($e->getRouteMatch());
        });
    }
    ...
}

módulo/mymodule/src/mymodule/ver/helper.php

namespace MyModule\View;

use Zend\View\Helper\AbstractHelper;

class Helper extends AbstractHelper
{

    protected $route;

    public function __construct($route)
    {
        $this->route = $route;
    }

    public function echoController()
    {
        $controller = $this->route->getParam('controller', 'index');
        echo $controller;
    }
}

En cualquier alcance

$this->myviewalias()->echoController();

En lugar de extender onBootStrap() en Module.php, puedes usar getViewHelperConfig() (También en Module.php). El ayudante real no cambia, pero obtienes el siguiente código para crearlo:

public function getViewHelperConfig()
{
   return array(
         'factories' => array(
            'ControllerName' => function ($sm) {
               $match = $sm->getServiceLocator()->get('application')->getMvcEvent()->getRouteMatch();
               $viewHelper = new \Application\View\Helper\ControllerName($match);
               return $viewHelper;
            },
         ),
   );
}

Código corto aquí:

$this->getHelperPluginManager()->getServiceLocator()->get('application')->getMvcEvent()->getRouteMatch()->getParam('action', 'index');

$controller = $this->getHelperPluginManager()->getServiceLocator()->get('application')->getMvcEvent()->getRouteMatch()->getParam('controller', 'index');

$controller = array_pop(explode('\', $controller));

Quería acceder al nombre actual del módulo/controlador/ruta en el menú de navegación parcial y no había forma de implementar una vista personalizada y acceder a él, se me ocurrió lo siguiente, lo estoy publicando aquí.

<?php
namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;

/**
 * View Helper to return current module, controller & action name.
 */
class CurrentRequest extends AbstractHelper
{
    /**
     * Current Request parameters
     *
     * @access protected
     * @var array
     */
    protected $params;

    /**
     * Current module name.
     *
     * @access protected
     * @var string
     */
    protected $moduleName;

    /**
     * Current controller name.
     *
     * @access protected
     * @var string
     */
    protected $controllerName;

    /**
     * Current action name.
     *
     * @access protected
     * @var string
     */
    protected $actionName;

    /**
     * Current route name.
     *
     * @access protected
     * @var string
     */
    protected $routeName;

    /**
     * Parse request and substitute values in corresponding properties.
     */
    public function __invoke()
    {
        $this->params = $this->initialize();
        return $this;
    }

    /**
     * Initialize and extract parameters from current request.
     *
     * @access protected
     * @return $params array
     */
    protected function initialize()
    {
        $sm = $this->getView()->getHelperPluginManager()->getServiceLocator();
        $router = $sm->get('router');
        $request = $sm->get('request');
        $matchedRoute = $router->match($request);
        $params = $matchedRoute->getParams();
        /**
         * Controller are defined in two patterns.
         * 1. With Namespace
         * 2. Without Namespace.
         * Concatenate Namespace for controller without it.
         */
        $this->controllerName = !strpos($params['controller'], '\\') ?
            $params['__NAMESPACE__'].'\\'.$params['controller'] :
            $params['controller'];
        $this->actionName = $params['action'];
        /**
         * Extract Module name from current controller name.
         * First camel cased character are assumed to be module name.
         */
        $this->moduleName = substr($this->controllerName, 0, strpos($this->controllerName, '\\'));
        $this->routeName = $matchedRoute->getMatchedRouteName();
        return $params;
    }

    /**
     * Return module, controller, action or route name.
     *
     * @access public
     * @return $result string.
     */
    public function get($type)
    {
        $type = strtolower($type);
        $result = false;
        switch ($type) {
            case 'module':
                    $result = $this->moduleName;
                break;
            case 'controller':
                    $result = $this->controllerName;
                break;
            case 'action':
                    $result = $this->actionName;
                break;
            case 'route':
                    $result = $this->routeName;
                break;
        }
        return $result;
    }
}

Para acceder a los valores en diseño/vista, aquí es cómo lo hago.

1. $this->currentRequest()->get('module');
2. $this->currentRequest()->get('controller');
3. $this->currentRequest()->get('action');
4. $this->currentRequest()->get('route');

Espero que esto ayude a alguien.

En ZF2 Beta4 se hizo de esta manera:

public function init(ModuleManager $moduleManager)
{

    $sharedEvents = $moduleManager->events()->getSharedManager();
    $sharedEvents->attach('bootstrap', 'bootstrap', array($this, 'onBootstrap'));
}

public function onBootstrap($e)
{
    $app     = $e->getParam('application');
    // some your code here
    $app->events()->attach('route', array($this, 'onRouteFinish'), -100);
}

public function onRouteFinish($e)
{
     $matches    = $e->getRouteMatch();
     $controller = $matches->getParam('controller');
     var_dump($controller);die();
}

yo creé CurrentRoute Ver ayudante para este propósito.

Instalarlo:

composer require tasmaniski/zf2-current-route

Módulo de registro en :

'modules' => array(
    '...',
    'CurrentRoute'
),

Úselo en cualquier archivo de vista/diseño:

$this->currentRoute()->getController();  // return current controller name
$this->currentRoute()->getAction();      // return current action name
$this->currentRoute()->getModule();      // return current module name
$this->currentRoute()->getRoute();       // return current route name

Puede ver la documentación y el código completos https://github.com/tasmaniski/zf2-current-rautee

$this->getHelperPluginManager()->getServiceLocator()->get('application')
     ->getMvcEvent()->getRouteMatch()->getParam('action', 'index');

$controller = $this->getHelperPluginManager()->getServiceLocator()
                   ->get('application')->getMvcEvent()->getRouteMatch()
                   ->getParam('controller', 'index');


$controller = explode('\\', $controller);

print_r(array_pop($controller));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top