Ответ 1
Другое решение без нового соответствия
$routeMatch = $serviceLocator->get('Application')->getMvcEvent()->getRouteMatch();
echo $routeMatch->getMatchedRouteName();
В настоящее время я изучаю ZF2, создавая небольшое приложение MVC примерно на основе приложения скелета. Сейчас я пытаюсь скрыть некоторые фиксированные элементы HTML на основе сопоставленного маршрута: как пример, я не хочу, чтобы главное меню отображалось во время фазы входа.
Я могу сделать это легко, передав параметры переключения в качестве возвращаемых значений из действий контроллера, но это не кажется правильным, поэтому я хотел бы просто проверить соответствие маршрута из макета и составить компоновку соответственно.
Проблема в том, что я не знаю, как получить согласованный маршрут в шаблоне. Это возможно? Существуют ли другие решения, позволяющие избежать добавления логики компоновки в контроллеры?
Изменить после хорошей работы Франкенштейна, я смог найти решение для этого. Мне нравится идея использования помощника, поэтому я просто попытался передать ему объект Application из функции boostrap в основном модуле:
$app = $e->getApplication();
$serviceManager = $app->getServiceManager();
....
$serviceManager->get('viewhelpermanager')->setFactory('getRoute', function($sm) use ($app) {
return new Helper\GetRoute($app);
});
и вспомогательная функция:
use Zend\View\Helper\AbstractHelper;
class GetRoute extends AbstractHelper {
private $sm;
public function __construct($app) {
$this->sm = $app->getServiceManager();
}
public function echoRoute() {
$router = $this->sm->get('router');
$request = $this->sm->get('request');
$routeMatch = $router->match($request);
if (!is_null($routeMatch))
echo $routeMatch->getMatchedRouteName();
}
}
возможно, есть более чистый, более ZF2ish способ сделать это...
Другое решение без нового соответствия
$routeMatch = $serviceLocator->get('Application')->getMvcEvent()->getRouteMatch();
echo $routeMatch->getMatchedRouteName();
Есть способ получить диспетчер сервисов в макете:
$sm = $this->getHelperPluginManager()->getServiceLocator();
а затем вы можете получить доступ к $sm->get('router')
и т.д.
Вы можете создать помощник вида, который реализует ServiceManagerAwareInterface. Затем внутри помощника View, используя экземпляр ServiceManager, чтобы получить как объекты роутера, так и запроса, восстановите соответствие маршрута.
$services = $this->getServiceManager();
$router = $services->get('router');
$request = $services->get('request');
$routeMatch = $router->match($request);
echo $routeMatch->getMatchedRouteName();
Я также рекомендую писать помощник View, чтобы код запускался только один раз для запроса.
При переходе на ZF3 вы должны использовать этот метод... поскольку getLocator больше не доступен (и он не корректно вставляет его).
Создайте помощника
namespace Application\View\Helper;
use Zend\Http\Request;
use Zend\Router\RouteStackInterface;
use Zend\View\Helper\AbstractHelper;
/**
* Helper to get the RouteMatch
*/
class RouteMatch extends AbstractHelper
{
/**
* RouteStackInterface instance.
*
* @var RouteStackInterface
*/
protected $router;
/**
* @var Request
*/
protected $request;
/**
* RouteMatch constructor.
* @param RouteStackInterface $router
* @param Request $request
*/
public function __construct(RouteStackInterface $router, Request $request)
{
$this->router = $router;
$this->request = $request;
}
/**
* @return \Zend\Router\RouteMatch
*/
public function __invoke()
{
return $this->router->match($this->request);
}
}
Создайте Factory для этого помощника
namespace Application\View\Helper;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class RouteMatchFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$router = $container->get('router');
$request = $container->get('request');
return new RouteMatch($router, $request);
}
}
Вызовите Factory на Module.php
и создайте для него псевдоним.
public function getViewHelperConfig()
{
return array(
'factories' => array(
RouteMatch::class => RouteMatchFactory::class,
),
'aliases' => array(
'routeMatch' => RouteMatch::class,
)
);
}
Что это... у вас есть помощник RouteMatch, используя новые стандарты ZF3.
Bye!
В поле зрения вы можете использовать:
$this->getHelperPluginManager()->getServiceLocator()->get('request')->getUri()->getPath();
или
$this->getHelperPluginManager()->getServiceLocator()->get('request')->getUri()->toString();
Я считаю, что вы можете решить это, найдя имена action/controller:
$controller = $this->getRequest()->getControllerName();
$action = $this->getRequest()->getActionName();
После того, как вы знаете действие, у вас могут быть особые условия для включения разделов макета.
Я считаю, вы можете использовать
$this->getHelperPluginManager()->getServiceLocator()->get('Application')->getMvcEvent()->getRouteMatch()->getMatchedRouteName();
Дополнительная информация о записи "Rodrigo Boratto" для интеграции getRouteMatch в ZF3 (я не могу комментировать, потому что у меня есть менее 50 репо...)
В окне helper введите следующую строку:
use Zend\Mvc\Router\RouteMatch as MvcRouteMatch;
use Zend\Mvc\Router\RouteStackInterface;
должен быть:
use Zend\Router\RouteMatch as MvcRouteMatch;
use Zend\Router\RouteStackInterface;
Я не знаю, когда они сделали это изменение, но файлы находятся в пространстве имен Zend\Router.
P.S. Я использую композитора, если это имеет значение.
Мой контроллер:
<?PHP
namespace SomeName\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class SomeController extends AbstractActionController
{
public function getIdAction()
{
$id = $this->params()->fromRoute('id', 0);
return new ViewModel(array(
'id' => $id,
));
}
}
Мой маршрутизатор:
<?php
return array(
'controllers' => array(
'invokables' => array(
'SomeName\Controller\Some' => 'SomeName\Controller\SomeController',
),
),
'router' => array(
'routes' => array(
'testId' => array(
'type' => 'segment',
'options' => array(
'route' => '/[:id]',
'constraints' => array(
'id' => '\d*',
),
'defaults' => array(
'controller' => 'SomeName\Controller\Some',
'action' => 'getId',
),
),
),
),
),
'view_manager' => array(
'template_path_stack' => array(
'album' => __DIR__ . '/../view',
),
),
);