我正在通过开发一个基于骨架应用程序的小型MVC应用程序来学习ZF2.现在我试图根据匹配的路由隐藏一些固定的
HTML元素:就像一个例子,我不想在登录阶段显示主菜单.
我可以通过将toggle参数作为返回值从控制器动作中传递,但是它感觉不对,所以我只想从布局中检查匹配的路由,并相应地组成布局.
问题是,我不知道如何在模板中获得匹配的路由.这可能吗?是否有其他解决方案可以避免在控制器中添加布局逻辑
经过一些好的弗兰肯斯坦工作后,我可以找到解决办法.我喜欢使用一个帮手的想法,所以我刚刚尝试从主模块的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的方式来做到这一点…
另一个解决方案没有新的匹配
$routeMatch = $serviceLocator->get('Application')->getMvcEvent()->getRouteMatch(); echo $routeMatch->getMatchedRouteName();