从我的研究中,有这样的信息RouteResult实例中的公共方法getMatchedRouteName()。问题是如何从视图到达此实例。
我们知道我们可以得到RouteResult,但是来自中间件__invoke()方法中的Request对象。
public function __invoke($request, $response, $next){
# instance of RouteResult
$routeResult = $request->getAttribute('Zend\Expressive\Router\RouteResult');
$routeName = $routeResult->getMatchedRouteName();
// ...
}
由于@timdev建议,我们将在现有的帮手UrlHelper找到灵感,并在自定义视图助手让几乎相同implementation。
总之我们将创建2个类。
- CurrentUrlHelper与方法setRouteResult()和
- CurrentUrlMiddleware与__invoke($ REQ,$资源,$ NEXT)
我们将在CurrentUrlMiddleware注入CurrentUrlHelper和 在__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);
}
}
现在,我们只需要注册一个新的视图助手和中间件在configs:
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,
],
而且finaly我们可以templates.global注册我们的视图助手。PHP
'view_helpers' => [
'factories' => [
# use factory to grab an instance of CurrentUrlHelper
'currentRoute' => CurrentUrlHelperFactory::class
]
],
您可以在任何模板文件中使用的辅助:)
<?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