Intereting Posts
Запрос веб-сайта по сценарию на стороне клиента = Скрипт с перекрестным скриптом. Но запрашивать веб-сайт по сценарию на стороне сервера – это не взлом! Зачем? Обнаружение того, является ли переменная PHP ссылкой / ссылкой Как загрузить изображение PHP и вставить путь в MySQL? Как написать SQL-запрос, который подсчитывает количество строк в месяц и год? Как передать параметры строки запроса в двоичный файл PHP? Вставка значения переменной PHP в файл Javascript Генерация галереи динамических изображений с использованием PHP и jQuery Получайте товары из интернет-магазина, используя простой парсер и разбиение на страницы Является ли это лучшим подходом к созданию контрольного журнала? Curl загружает файлы 2.5k + слишком медленно Неустранимая ошибка: нельзя использовать возвращаемое значение функции в контексте записи Как правильно получить контент и не нарушать html-теги с помощью strip_tags с substr? Как использовать функции MySQL в Propel PHP: Array_unshift – не числовой индекс Перенаправление Laravel из частного метода

ZF2 – получить имя контроллера в макете / представлениях

Я знаю, что с 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));