ZF2 - Geben Sie den Controller -Namen in Layout/Ansichten ein
-
27-10-2019 - |
Frage
Ich weiß, dass Sie mit ZF1 den Namen Modul/Controller mit benutzerdefinierten Ansichtshelfern abrufen würden, die das Singleton FrontController -Objekt erhalten und den Namen dort erhalten.
Verwenden von ZF2, wie sie viel von der Singleton -Natur des Rahmens abgeschafft und DI eingeführt habe, wo ich Aliase für alle meine Controller innerhalb dieses Moduls angegeben habe ... Ich kann mir vorstellen, dass ich sie durch den Zugriff auf die DI oder das Injektieren der DI erhalten würde Aktueller Name in das Layout.
Jeder hat eine Idee, wie Sie es tun würden. Ich denke, es gibt hundert verschiedene Arten, aber nachdem ich ein paar Stunden lang an dem Code geschnüffelt habe, kann ich nicht wirklich herausfinden, wie es jetzt geschehen soll.
Der Grund, warum ich wollte, dass der Controller -Name ihn als Klasse für ein bestimmtes Controller -Styling dem Körper hinzufügen soll.
Danke, Dom
Lösung
ZF2 ist und das Skelett auch. Dies wird auf dem Skelett hinzugefügt, daher sollte es Ihr bestes Beispiel sein:
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);
}
Der eigentliche 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;
}
}
}
In einer Ihrer Ansichten/Layouts
echo $this->controllerName()
Andere Tipps
Dies wäre eine Lösung, die ich mit ZF2 Beta5 arbeiten musste
Modul/MyModule/modul.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());
});
}
...
}
Modul/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;
}
}
In jeder Sucher
$this->myviewalias()->echoController();
anstatt sich zu verlängern onBootStrap()
in Module.php
, Sie können verwenden getViewHelperConfig()
(auch in Module.php
). Der tatsächliche Helfer ist unverändert, aber Sie erhalten den folgenden Code, um ihn zu erstellen:
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;
},
),
);
}
Kurzer Code hier:
$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));
Ich wollte im Navigationsmenü teilweise auf den aktuellen Modul-/Controller/Routennamen zugreifen, und es gab keine Möglichkeit, einen benutzerdefinierten Ansichtshelfer zu implementieren und darauf zuzugreifen, ich habe Folgendes gefunden, ich poste es hier.
<?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;
}
}
Um auf die Werte in Layout/Ansicht zuzugreifen, hier mache ich es.
1. $this->currentRequest()->get('module');
2. $this->currentRequest()->get('controller');
3. $this->currentRequest()->get('action');
4. $this->currentRequest()->get('route');
Hoffe das hilft jemandem.
In ZF2 Beta4 machte es auf diese Weise:
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();
}
ich erschuf CurrentRoute Helfer für diesen Zweck anzeigen.
Es installieren:
composer require tasmaniski/zf2-current-route
Registrieren Sie das Modul in config/application.config.php:
'modules' => array(
'...',
'CurrentRoute'
),
Verwenden Sie es in jeder Ansichts-/Layout -Datei:
$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
Sie können vollständige Dokumentation und Code sehen 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));