私の調査によると、 public メソッドgetMatchedRouteName()のRouteResultインスタンスにそのような情報があります。問題は、ビューからこのインスタンスに到達する方法です。
RouteResult を取得できることはわかっていますが、ミドルウェアの __invoke() メソッドにある Request オブジェクトから取得します。
public function __invoke($request, $response, $next){
# instance of RouteResult
$routeResult = $request->getAttribute('Zend\Expressive\Router\RouteResult');
$routeName = $routeResult->getMatchedRouteName();
// ...
}
@timdev が推奨するように、既存のヘルパーUrlHelperでインスピレーションを見つけ、カスタム ビュー ヘルパーでほぼ同じ実装を行います。
要するに、2 つのクラスを作成します。
- メソッドsetRouteResult ()を使用した CurrentUrlHelperおよび
- __invoke ($req, $res, $next)を使用したCurrentUrlMiddleware
CurrentUrlMiddleware に CurrentUrlHelper を挿入し、__invoke() メソッドで適切な RouteResult インスタンスを使用してCurrentUrlHelper::setRouteResult()を呼び出します。後で、RouteResult インスタンスを含む CurrentUrlHelper を使用できます。どちらのクラスにも Factory が必要です。
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 に登録するだけで済みます。
依存関係.global.php
'dependencies' => [
'invokables' => [
# dont have any constructor!
CurrentUrlHelper::class => CurrentUrlHelper::class,
],
]
ミドルウェア-pipeline.global.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
]
],
これで、任意のテンプレート ファイルでヘルパーを使用できます :)
<?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';
?>