gpt4 book ai didi

php - 如何在 View 中获取匹配的路线名称 - Zend Expressive

转载 作者:行者123 更新时间:2023-12-02 04:08:39 25 4
gpt4 key购买 nike

我知道我可以通过路由名称生成 URL

<?php echo $this->url('route-name') #in view file ?>

但是我可以获得相反方向的信息吗?我需要从当前的 URL/URI 获取路由名称。

真实情况是:我有layout.phtml,其中顶部菜单(html)。菜单中的当前链接需要用 css 类标记。所以,我需要的例子是:

<?php // in layout.phtml file
$index_css = $this->getRouteName() == 'home-page' ? 'active' : 'none';
$about_css = $this->getRouteName() == 'about' ? 'active' : 'none';
$contact_css = $this->getRouteName() == 'contact' ? 'active' : 'none';
?>

我正在使用快速路线,但我对任何解决方案都很感兴趣。解决方案不必位于 View 文件中。

最佳答案

根据我的研究,RouteResult中有这样的信息。公共(public)方法 getMatchedRouteName() 中的实例。问题是如何从 View 到达这个实例。

我们知道我们可以获取 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在自定义 View 助手中。

简而言之,我们将创建 2 个类。

  1. CurrentUrlHelper 以及方法 setRouteResult()
  2. CurrentUrlMiddleware__invoke($req, $res, $next)

我们将在 CurrentUrlMiddleware 中注入(inject) CurrentUrlHelper 并在 __invoke() 方法中使用适当的 RouteResult 实例调用 CurrentUrlHelper::setRouteResult() 。稍后我们可以将 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
}
}

还有我们的新 helper :

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);
}
}

现在我们只需要在配置中注册新的 View 助手和中间件:

dependency.global.php

'dependencies' => [
'invokables' => [
# dont have any constructor!
CurrentUrlHelper::class => CurrentUrlHelper::class,
],
]

middleware-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,
],

最后我们可以在 templates.global.php 中注册我们的 View Helper

'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';
?>

关于php - 如何在 View 中获取匹配的路线名称 - Zend Expressive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38078780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com