Zend框架2:鉴于获得与之匹配的路由(Zend Framework 2: get matched

2019-06-27 06:32发布

我目前正在通过开发大致基于骨架应用小MVC应用程序学习ZF2。 现在,我试图隐藏基于匹配的路由上的一些固定的HTML元素:只是作为一个例子,我不希望主菜单在登录阶段表现。

我能做到这一点很容易地通过传递切换参数从控制器动作返回值,但感觉不对,所以我想只是检查从布局中与之匹配的路由,并相应地构成的布局。

问题是,我不知道如何在模板匹配的路线。 这可能吗? 还有没有其他的解决方案,以避免增加布局逻辑为控制器?

编辑后,一些很好的科学怪人的工作,我能够找到一个解决方案。 我喜欢用一个帮手的想法,所以我只是试图通过它的应用对象,从主要模块中的自举功能:

$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方式...

Answer 1:

没有新的比赛的另一个解决方案

$routeMatch = $serviceLocator->get('Application')->getMvcEvent()->getRouteMatch();

echo $routeMatch->getMatchedRouteName();


Answer 2:

有一种方式来获得服务管理器布局:

$sm = $this->getHelperPluginManager()->getServiceLocator();

然后你就可以访问$sm->get('router')等。



Answer 3:

你可以创建一个实现ServiceManagerAwareInterface视图助手。 然后,使用的ServiceManager实例,以检索两个路由器的请求对象,然后重构路径匹配的视图助手里面。

$services = $this->getServiceManager();

$router = $services->get('router');
$request = $services->get('request');

$routeMatch = $router->match($request);
echo $routeMatch->getMatchedRouteName();

我也建议你写的视图助手,这样的代码只有每个请求触发一次。



Answer 4:

当移动到ZF3,你应该考虑使用这种方法...自从getLocator已不存在(和它不纠正它注入)。

  1. 创建助手

     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); } } 
  2. 这个助手创建厂

     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); } } 
  3. 请拨打您的工厂Module.php ,并为它创建一个别名。

     public function getViewHelperConfig() { return array( 'factories' => array( RouteMatch::class => RouteMatchFactory::class, ), 'aliases' => array( 'routeMatch' => RouteMatch::class, ) ); } 

就是这样......你有使用RouteMatch助手新ZF3标准。

再见!



Answer 5:

鉴于你可以使用:

$this->getHelperPluginManager()->getServiceLocator()->get('request')->getUri()->getPath();

要么

$this->getHelperPluginManager()->getServiceLocator()->get('request')->getUri()->toString();


Answer 6:

我相信你可以通过查找动作/控制器名称解决它:

$controller = $this->getRequest()->getControllerName();
$action = $this->getRequest()->getActionName();

一旦你知道的动作,你可以有特定的条件,使布局的部分。



Answer 7:

我认为你可以使用

$this->getHelperPluginManager()->getServiceLocator()->get('Application')->getMvcEvent()->getRouteMatch()->getMatchedRouteName();


Answer 8:

关于“罗德里戈Boratto”的帖子在ZF3整合getRouteMatch附加信息(我无法评论,因为我有50岁以下的回购...)

在视图助手文件中,这些行:

use Zend\Mvc\Router\RouteMatch as MvcRouteMatch;
use Zend\Mvc\Router\RouteStackInterface;

应该:

use Zend\Router\RouteMatch as MvcRouteMatch;
use Zend\Router\RouteStackInterface;

我不知道他们什么时候做出改变,但该文件在Zend的\路由器命名空间。

PS我使用的作曲家,如果该事项。



Answer 9:

我的控制器:

    <?PHP
    namespace SomeName\Controller;

    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\ViewModel;

    class SomeController extends AbstractActionController
    {
        public function getIdAction()
        {
            $id = $this->params()->fromRoute('id', 0);
            return new ViewModel(array(
                'id' => $id,
            ));
        }
    }

我的路由器:

    <?php
    return array(
        'controllers' => array(
            'invokables' => array(
                'SomeName\Controller\Some' => 'SomeName\Controller\SomeController',
            ),
        ),

        'router' => array(
            'routes' => array(
                'testId' => array(
                    'type'    => 'segment',
                    'options' => array(
                        'route'    => '/[:id]',
                        'constraints' => array(
                            'id' => '\d*',
                        ),
                        'defaults' => array(
                            'controller' => 'SomeName\Controller\Some',
                            'action'     => 'getId',
                        ),
                    ),
                ),
            ),
        ),

        'view_manager' => array(
            'template_path_stack' => array(
                'album' => __DIR__ . '/../view',
            ),
        ),
    );


Answer 10:

在任何视图或布局,您可以使用此功能来测试路线:

<?php function itsRoute($routeName){
    $flag = false;
    if($this->serverUrl(true) == $this->url($route,[],['force_canonical'=>true]))){
        $flag = true;
    }

    return $flag;
}


文章来源: Zend Framework 2: get matched route in view