我尝试遵循本主题中的建议: zend Framework 2 + routing database
我有一个路由类:
namespace Application'Router;
use Zend'Mvc'Router'Http'RouteInterface;
use Zend'ServiceManager'ServiceLocatorAwareInterface;
use Zend'Mvc'Router'RouteMatch;
class Content implements RouteInterface, ServiceLocatorAwareInterface {
protected $defaults = array();
protected $routerPluginManager = null;
public function __construct(array $defaults = array()) {
$this->defaults = $defaults;
}
public function setServiceLocator('Zend'ServiceManager'ServiceLocatorInterface $routerPluginManager) {
$this->routerPluginManager = $routerPluginManager;
}
public function getServiceLocator() {
return $this->routerPluginManager;
}
public static function factory($options = array()) {
if ($options instanceof 'Traversable) {
$options = ArrayUtils::iteratorToArray($options);
} elseif (!is_array($options)) {
throw new InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options');
}
if (!isset($options['defaults'])) {
$options['defaults'] = array();
}
return new static($options['defaults']);
}
public function match(Request $request, $pathOffset = null) {
if (!method_exists($request, 'getUri')) {
return null;
}
$uri = $request->getUri();
$fullPath = $uri->getPath();
$path = substr($fullPath, $pathOffset);
$alias = trim($path, '/');
$options = $this->defaults;
$options = array_merge($options, array(
'path' => $alias
));
return new RouteMatch($options);
}
public function assemble(array $params = array(), array $options = array()) {
if (array_key_exists('path', $params)) {
return '/' . $params['path'];
}
return '/';
}
public function getAssembledParams() {
return array();
}
}
注意 match() 函数返回 Zend''Mvc''Router''RouteMatch 实例的对象但是,在文件中 Zend''Mvc''Router''Http''TreeRouteStack 中,它会检查对象是否为 RouteMatch 的实例(不带命名空间前缀)
if (
($match = $route->match($request, $baseUrlLength, $options)) instanceof RouteMatch
&& ($pathLength === null || $match->getLength() === $pathLength)
)
在我的情况下,由于命名空间,条件失败了。
有什么建议吗?
好的,我想出了问题所在。而不是返回 Zend''Mvc''Router''RouteMatch,我应该返回 Zend''Mvc''Router''Http''RouteMatch
这解决了我的问题