如何在视图中使用 zf2 hasRoute()
How to use zf2 hasRoute() in a view
我正在尝试开发一个索引视图,该视图使用类似以下内容呈现链接:
echo "<a href=";
echo $this->url($route, array('action' => $action, 'id' =>$id));
echo ">$targetName</a>";
其中 $route
、$action
、$id
和 $targetName
均来自数据库。
我不能依赖 $route
变量的数据,当 $route
不匹配可行的路由时,整个页面崩溃。我想使用 if
语句来评估路由的存在,但我还没有找到正确的解决方案。我想我正在寻找类似的东西:
if ( hasRoute($this->url($route, array('action' => $action, 'id' =>$id))) ) {
// render something
} else {
// render something different
}
但是,我无法通过阅读文档确定如何正确使用hasRoute()
功能。上面的简单代码导致 Fatal error: Call to undefined function hasRoute()
。
Zend Framework 中没有 hasRoute
视图助手,但您可以创建一个 (documentation)。
首先,您需要创建视图助手 class,它具有路由器作为依赖项:
<?php
// file module/Application/View/Helper/HasRoute.php
namespace Application\View\Helper;
use Zend\Mvc\Router\SimpleRouteStack;
use Zend\View\Helper\AbstractHelper;
final class HasRoute extends AbstractHelper
{
/** @var SimpleRouteStack */
private $router;
/**
* @param SimpleRouteStack $router
*/
public function __construct(SimpleRouteStack $router)
{
$this->router = $router;
}
/**
* @param string $routeName
* @return bool
*/
public function __invoke($routeName)
{
return $this->router->hasRoute($routeName);
}
}
然后你需要这个视图助手的工厂,它创建我们的助手的新实例并注入路由器:
<?php
// file module/Application/Factory/View/Helper/HasRouteFactory.php
namespace Application\Factory\View\Helper;
use Application\View\Helper\HasRoute;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class HasRouteFactory implements FactoryInterface
{
/**
* Create service
*
* @param ServiceLocatorInterface $serviceLocator
* @return HasRoute
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$router = $serviceLocator->getServiceLocator()->get('router');
return new HasRoute($router);
}
}
最后你需要注册这个新的视图助手来查看助手插件管理器:
// Application module configuration file in module/Application/config/module.config.php
// ...
'view_helpers' => [
'factories' => [
'hasRoute' => \Application\Factory\View\Helper\HasRouteFactory::class,
],
],
// ...
然后您可以在任何模板中调用此视图助手:
<?php
if ($this->hasRoute('home')) {
// do something if there is route with name 'home' defined
}
?>
我正在尝试开发一个索引视图,该视图使用类似以下内容呈现链接:
echo "<a href=";
echo $this->url($route, array('action' => $action, 'id' =>$id));
echo ">$targetName</a>";
其中 $route
、$action
、$id
和 $targetName
均来自数据库。
我不能依赖 $route
变量的数据,当 $route
不匹配可行的路由时,整个页面崩溃。我想使用 if
语句来评估路由的存在,但我还没有找到正确的解决方案。我想我正在寻找类似的东西:
if ( hasRoute($this->url($route, array('action' => $action, 'id' =>$id))) ) {
// render something
} else {
// render something different
}
但是,我无法通过阅读文档确定如何正确使用hasRoute()
功能。上面的简单代码导致 Fatal error: Call to undefined function hasRoute()
。
Zend Framework 中没有 hasRoute
视图助手,但您可以创建一个 (documentation)。
首先,您需要创建视图助手 class,它具有路由器作为依赖项:
<?php
// file module/Application/View/Helper/HasRoute.php
namespace Application\View\Helper;
use Zend\Mvc\Router\SimpleRouteStack;
use Zend\View\Helper\AbstractHelper;
final class HasRoute extends AbstractHelper
{
/** @var SimpleRouteStack */
private $router;
/**
* @param SimpleRouteStack $router
*/
public function __construct(SimpleRouteStack $router)
{
$this->router = $router;
}
/**
* @param string $routeName
* @return bool
*/
public function __invoke($routeName)
{
return $this->router->hasRoute($routeName);
}
}
然后你需要这个视图助手的工厂,它创建我们的助手的新实例并注入路由器:
<?php
// file module/Application/Factory/View/Helper/HasRouteFactory.php
namespace Application\Factory\View\Helper;
use Application\View\Helper\HasRoute;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class HasRouteFactory implements FactoryInterface
{
/**
* Create service
*
* @param ServiceLocatorInterface $serviceLocator
* @return HasRoute
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$router = $serviceLocator->getServiceLocator()->get('router');
return new HasRoute($router);
}
}
最后你需要注册这个新的视图助手来查看助手插件管理器:
// Application module configuration file in module/Application/config/module.config.php
// ...
'view_helpers' => [
'factories' => [
'hasRoute' => \Application\Factory\View\Helper\HasRouteFactory::class,
],
],
// ...
然后您可以在任何模板中调用此视图助手:
<?php
if ($this->hasRoute('home')) {
// do something if there is route with name 'home' defined
}
?>