Я знаю, что с ZF1 вы получите имя модуля / контроллера, используя пользовательские средства просмотра справки, которые будут получать объект singleton frontController и получить там имя.
Используя ZF2, поскольку они полностью отменили одноэлементный характер структуры и внедрили DI, где я указал псевдонимы для всех моих контроллеров в этом модуле … Я могу себе представить, что я получил бы доступ через DI или, возможно, текущее имя в макет.
Кто-нибудь понял, как вы это сделаете. Я предполагаю, что существует сто разных способов, но после того, как я несколько раз обнюхивал код в течение нескольких часов, я не могу понять, как это сделать сейчас.
Причина, по которой я хотел получить имя контроллера, – это добавить его в тело как класс для конкретного стиля контроллера.
Спасибо, Dom
ZF2 отсутствует, а также скелет. Это добавление сверху скелета, поэтому это должен быть ваш лучший пример:
Внутри 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); }
Фактический 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; } } }
Внутри любого из ваших представлений / макетов
echo $this->controllerName()
Это было бы решением, которое я получил для работы с zf2 beta5
модуль / 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()); }); } ... }
модуль / 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; } }
В любом файле просмотра
$this->myviewalias()->echoController();
вместо расширения onBootStrap()
в Module.php
вы можете использовать getViewHelperConfig()
(также в Module.php
). Фактический помощник не изменился, но для его создания вы получите следующий код:
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; }, ), ); }
Короткий код здесь:
$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));
Я хотел получить доступ к текущему модулю / контроллеру / названию маршрута в части меню навигации, и не было никакого способа, кроме как реализовать пользовательский помощник вида и получить к нему доступ, я придумал следующее, я размещаю его здесь.
<?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; } }
Чтобы получить доступ к значениям в макете / представлении, вот как я это делаю.
1. $this->currentRequest()->get('module'); 2. $this->currentRequest()->get('controller'); 3. $this->currentRequest()->get('action'); 4. $this->currentRequest()->get('route');
Надеюсь, это поможет кому-то.
В zf2 beta4 он был сделан следующим образом:
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(); }
Для этой цели я создал CurrentRoute View Helper.
Установите его:
composer require tasmaniski/zf2-current-route
Зарегистрировать модуль в config / application.config.php :
'modules' => array( '...', 'CurrentRoute' ),
Используйте его в любом файле вида / макета:
$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
Вы можете просмотреть полную документацию и код 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));