gpt4 book ai didi

model-view-controller - Zend 框架 2 : get matched route in view

转载 作者:行者123 更新时间:2023-12-03 23:59:19 24 4
gpt4 key购买 nike

我目前正在通过大致基于骨架应用程序开发一个小型 MVC 应用程序来学习 ZF2。现在我正在尝试根据匹配的路由隐藏一些固定的 HTML 元素:例如,我不希望在登录阶段显示主菜单。

我可以通过将切换参数作为 Controller 操作的返回值传递来轻松做到这一点,但感觉不对,所以我想从布局中检查匹配的路由并相应地组合布局。

问题是,我不知道如何在模板中获取匹配的路由。这可能吗?是否有其他解决方案可以避免将布局逻辑添加到 Controller 中?

编辑 经过一些出色的科学怪人工作,我能够找到解决方案。我喜欢使用帮助器的想法,所以我只是尝试从主模块中的 boostrap 函数将 Application 对象传递给它:

$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 的方式来做到这一点......

最佳答案

迁移到 ZF3 时,您应该考虑使用此方法……因为 getLocator 不再可用(并且注入(inject)它是不正确的)。

  • 创建助手
    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);
    }
    }
  • 为这个助手创建一个工厂
    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);
    }

    }
  • 调用您的 Module.php 联系您的工厂并为其创建别名。
    public function getViewHelperConfig()
    {
    return array(
    'factories' => array(
    RouteMatch::class => RouteMatchFactory::class,
    ),
    'aliases' => array(
    'routeMatch' => RouteMatch::class,
    )
    );
    }

  • 就是这样...您有一个使用新 ZF3 标准的 RouteMatch 助手。

    再见!

    关于model-view-controller - Zend 框架 2 : get matched route in view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12068648/

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