ZF2 – Obtenga el nombre del controlador en el diseño/vistas

8 minutos de lectura

Sé que con ZF1 recuperaría el nombre del módulo/controlador utilizando View Helpers personalizados que obtendrían el objeto singleton frontController y obtendrían el nombre allí.

Usando ZF2, ya que eliminaron gran parte de la naturaleza única del marco e introdujeron DI donde especifiqué alias para todos mis controladores dentro de este módulo … Puedo imaginar que lo obtendría accediendo al DI o quizás inyectando el nombre actual en el diseño.

Alguien tiene alguna idea de cómo lo harías. Supongo que hay cientos de formas diferentes, pero después de olfatear el código durante unas horas, realmente no puedo entender cómo se supone que debe hacerse ahora.

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

gracias, dom

ZF2 - Obtenga el nombre del controlador en el diseño/vistas
Intellix

ZF2 está fuera y también el esqueleto. Esto se agrega encima del esqueleto, por lo que debería ser su mejor ejemplo:

Módulo interior.php

public function onBootstrap($e)
{
    $e->getApplication()->getServiceManager()->get('translator');
    $e->getApplication()->getServiceManager()->get('viewhelpermanager')->setFactory('controllerName', function($sm) use ($e) {
        $viewHelper = new ViewHelperControllerName($e->getRouteMatch());
        return $viewHelper;
    });

    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
}

El ViewHelper real:

// Application/View/Helper/ControllerName.php

namespace ApplicationViewHelper;

use ZendViewHelperAbstractHelper;

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()

  • Además, en caso de que obtenga errores al llamar a getParam() en un objeto que no sea, podría valer la pena verificar si se está llamando a un recurso y si existe… como un favicon. Se había llamado y arrancado ZF2 sin ningún parámetro cuando se llamó a favicon y no existía, por lo que esto se estaba quejando/registrando un error y haciendo que cada solicitud fuera realmente lenta.

    – Intellix

    18 ene.

  • Hola Dominic Watson, tengo el error en lugar de la página 404. ¿Puedo saber cómo verificar si se está llamando al recurso o si existe? Soy nuevo en ZF2, por favor ayuda

    – Katiravan

    01 jul.


  • Agregué if ($this->routeMatch) en el código anterior para verificar que existe, por lo que debería obtener 404 en lugar de un error (ya que no hay routeMatch para favicon faltante o algo así)

    – Intellix

    01 jul.

  • Error fatal: no se encontró la clase ‘AplicaciónVistaAyudanteNombre del controlador’ en C:wampwwwprojectmoduleApplicationModule.php en la línea 95… Mi estructura de directorio es módulo>>Aplicación>>vista> >Ayudante>>ControllerName.php….¿Qué pasa?

    – usuario269867

    12 feb. 14 a las 13:38


  • Tiene que estar en: module>>Application>>src>>Application>>View>>Helper>>ControllerName.php – Lo ha puesto donde están sus vistas reales de phtml

    – Intellix

    12 feb. 14 a las 22:33

ZF2 - Obtenga el nombre del controlador en el diseño/vistas
Borje

Esta sería una solución que tengo para trabajar con zf2 beta5

módulo/MiMódulo/Módulo.php

namespace MyModule;

use ZendMvcModuleRouteListener;
use MyModuleViewHelper 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/MiMódulo/src/MiMódulo/View/Helper.php

namespace MyModuleView;

use ZendViewHelperAbstractHelper;

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 archivo de vista

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

  • Creo que puedes cambiar echoController() a __invoke() y cambiar echo $controller; para devolver $controlador

    – Intellix

    25 oct.

  • Esta solución es incluso mejor que la aceptada (más delgada onBootstrap)! Por razones lógicas, sugiero colocar esto en el Application módulo en lugar de uno de sus propios módulos debido al hecho de que eres capaz de llamar $this->myviewalias() en cualquier vista de módulo. Como sugirió Dominic, si usas __invoke() y devolver la cadena, no es necesario ->echoController(), pero si quieres usar myviewalias para más propósitos, no use __invoke() y agregue más funciones al ayudante (por ejemplo: otra función que devuelve la acción ->getParam('action', 'index')). ¡Espero eso ayude!

    – Brazo

    13 ago. 13 en 11:57


  • En realidad, la respuesta aceptada edita el onBootstrap función de ApplicationModule.php… Entonces, de hecho, son casi la misma respuesta. La verdadera diferencia es cómo cada uno usa las funciones de vista (por __invoke() o funciones independientes).

    – Brazo

    13 ago. 13 en 12:12


  • Si hubiera hecho esto hoy, habría registrado la vista de fábrica de ayuda en el método Module::getViewHelperConfig() en lugar de configurarlo en el arranque. Vea el ejemplo de dstj a continuación. Si el ayudante solo necesita hacer eco del controlador, el método __invoke() dirige los archivos de vista de aspecto más delgado. Si desea que el mismo ayudante pueda generar otras cosas como acción, entonces la solución anterior podría ser preferible.

    – Borje

    25 sep.


en lugar de extender onBootStrap() en Module.php, puedes usar getViewHelperConfig() (También en Module.php). El ayudante real no ha cambiado, 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 ApplicationViewHelperControllerName($match);
               return $viewHelper;
            },
         ),
   );
}

ZF2 - Obtenga el nombre del controlador en el diseño/vistas
James laboratorios

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 módulo/controlador/nombre de ruta actual en el menú de navegación parcial y no había otra forma que implementar el asistente de vista personalizado y acceder a él. Se me ocurrió lo siguiente, lo estoy publicando aquí.

<?php
namespace ApplicationViewHelper;

use ZendViewHelperAbstractHelper;

/**
 * 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, así es como 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.

  • no hay __NAMESPACE__ en $params. ¿Qué versión estás usando?

    – Tasmaniski

    05 oct.


ZF2 - Obtenga el nombre del controlador en el diseño/vistas
hacer

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();
}

  • no hay __NAMESPACE__ en $params. ¿Qué versión estás usando?

    – Tasmaniski

    05 oct.


yo creé Ruta actual Ver Helper para este propósito.

Instalarlo:

composer require tasmaniski/zf2-current-route

Registrar módulo en config/aplicación.config.php:

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

Úselo en cualquier vista/archivo de 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

Puedes ver la documentación completa y el código. https://github.com/tasmaniski/zf2-ruta-actual

.

¿Ha sido útil esta solución?