php - curso - zend framework tutorial
ZF2: obtenga el nombre del controlador en el diseƱo/vistas (8)
Sé con ZF1 que recuperarías el nombre del módulo / controlador usando View Helpers personalizados que obtendrían el objeto singleton frontController y obtendrían el nombre allí.
Usando ZF2 ya que han abolido gran parte de la naturaleza singleton del framework e introducido DI donde he especificado alias para todos mis controladores dentro de este módulo ... Me imagino que lo obtendría a través del acceso 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 maneras diferentes, pero después de husmear sobre el código durante unas horas, no puedo entender cómo se debe hacer ahora.
La razón por la que quería el nombre del controlador es agregarlo al cuerpo como una clase para un diseño de controlador específico.
Gracias, Dom
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));
En zf2 beta4 lo 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();
}
Esta sería una solución que tengo para trabajar con zf2 beta5
module / MyModule / Module.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());
});
}
...
}
module / MyModule / src / MyModule / View / 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 archivo de visualización
$this->myviewalias()->echoController();
Quería acceder al nombre del módulo / controlador / ruta actual en el menú de navegación parcial y no había otra forma más que implementar el asistente de visualización personalizado 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 el 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.
ZF2 está fuera y también lo está el esqueleto. Esto se agrega al esqueleto, por lo que debería ser tu mejor ejemplo:
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);
}
El ViewHelper real:
// 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 tus vistas / diseños
echo $this->controllerName()
en lugar de extender onBootStrap()
en Module.php
, puede usar getViewHelperConfig()
(también en Module.php
). El asistente real no se modifica, 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;
},
),
);
}
Creé CurrentRoute View Helper para este propósito.
Instalarlo:
composer require tasmaniski/zf2-current-route
Módulo de registro en config / application.config.php :
''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 completa y el código https://github.com/tasmaniski/zf2-current-route
$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));