Из моего исследования, есть такая информация в RouteResult экземпляр в общедоступном методе getMatchedRouteName(). Проблема заключается в том, как добраться до этого экземпляра из представления.
Мы знаем, что мы можем получить RouteResult, но из объекта Request, который находится в методе __invoke() промежуточного ПО.
public function __invoke($request, $response, $next){
# instance of RouteResult
$routeResult = $request->getAttribute('Zend\Expressive\Router\RouteResult');
$routeName = $routeResult->getMatchedRouteName();
// ...
}
Как @timdev рекомендовал нам найти вдохновение в существующих помощник UrlHelper и делаем почти то же implementation в пользовательском View Helper.
Одним словом, мы создадим 2 класса.
- CurrentUrlHelper с помощью метода setRouteResult() и
- CurrentUrlMiddleware с __invoke ($ REQ, $ Рез, $ следующая)
Мы впрыскивать CurrentUrlHelper в CurrentUrlMiddleware и в методе __invoke() вызывают CurrentUrlHelper :: setRouteResult() с соответствующим экземпляром RouteResult. Позже мы можем использовать наш CurrentUrlHelper с экземпляром RouteResult. Оба класса должны иметь фабрику.
class CurrentUrlMiddlewareFactory {
public function __invoke(ContainerInterface $container) {
return new CurrentUrlMiddleware(
$container->get(CurrentUrlHelper::class)
);
}
}
class CurrentUrlMiddleware {
private $currentUrlHelper;
public function __construct(CurrentUrlHelper $currentUrlHelper) {
$this->currentUrlHelper = $currentUrlHelper;
}
public function __invoke($request, $response, $next = null) {
$result = $request->getAttribute('Zend\Expressive\Router\RouteResult');
$this->currentUrlHelper->setRouteResult($result);
return $next($request, $response); # continue with execution
}
}
И наш новый помощник:
class CurrentUrlHelper {
private $routeResult;
public function __invoke($name) {
return $this->routeResult->getMatchedRouteName() === $name;
}
public function setRouteResult(RouteResult $result) {
$this->routeResult = $result;
}
}
class CurrentUrlHelperFactory{
public function __invoke(ContainerInterface $container){
# pull out CurrentUrlHelper from container!
return $container->get(CurrentUrlHelper::class);
}
}
Теперь нам нужно только зарегистрировать наш новый вид Helper и Middleware в конфиги:
dependencies.global.php
'dependencies' => [
'invokables' => [
# dont have any constructor!
CurrentUrlHelper::class => CurrentUrlHelper::class,
],
]
middleware-pipeline.globa l.php
'factories' => [
CurrentUrlMiddleware::class => CurrentUrlMiddlewareFactory::class,
],
'middleware' => [
Zend\Expressive\Container\ApplicationFactory::ROUTING_MIDDLEWARE,
Zend\Expressive\Helper\UrlHelperMiddleware::class,
CurrentUrlMiddleware::class, # Our new Middleware
Zend\Expressive\Container\ApplicationFactory::DISPATCH_MIDDLEWARE,
],
И, наконец, мы можем зарегистрировать наш View Helper в templates.global.PHP
'view_helpers' => [
'factories' => [
# use factory to grab an instance of CurrentUrlHelper
'currentRoute' => CurrentUrlHelperFactory::class
]
],
важно зарегистрировать нашу межплатформенное после ROUTING_MIDDLEWARE и перед DISPATCH_MIDDLEWARE!
Кроме того, у нас есть CurrentUrlHelperFactory, чтобы присвоить его ключу 'currentRoute'.
Теперь вы можете использовать помощника в любом файле шаблона :)
<?php // in layout.phtml file
$index_css = $this->currentRoute('home-page') ? 'active' : 'none';
$about_css = $this->currentRoute('about') ? 'active' : 'none';
$contact_css = $this->currentRoute('contact') ? 'active' : 'none';
?>
Возможно, вам нужен помощник, чтобы получить маршрутизатор, который имеет метод 'match'. [Неиспользованная предполагаемая реализация] (http://stackoverflow.com/a/36337414/2908724). – bishop