Zend 框架 2 + 路由数据库 [英] zend framework 2 + routing database
问题描述
zend 框架 2 有问题,我想要一个创建路由数据库,例如
hi have a problemn with zend framework 2 i want a create routing database for example
/hello/index => is Application/Controllers/HomeController
/CustomURL => is Application/Controllers/HomeController
我从数据库中检索到的 CustomUrl 我这里是我的配置文件
the CustomUrl i retrieve from database i here is my configuration file
/// module.config.php
'router' => array(
'routes' => array(
.....
'node' => array(
'type' => 'Application\Router\Page',//src/Application/Router/Page.php
'options' => array(
'route' => '/node',
'defaults' => array(
'controller' => 'Application\Controller\Index',
'action' => 'index',
),
),
),
),
),....
这是我的路由器类
namespace Application\Router;
use Zend\Mvc\Router\Exception;
use Zend\Stdlib\ArrayUtils;
use Zend\Stdlib\RequestInterface as Request;
use Zend\Mvc\Router\Http;
use Zend\Mvc\Router\Http\Literal;
class Page extends Literal
{
protected $routePluginManager = null;
protected $defaults = array();
public function match(Request $request, $pathOffset = null)
{
$uri = $request->getUri();
$path = $uri->getPath();
//sample logic here
//for /about/gallery uri set node id to 1
//todo: get action, controller and module from navigation
if($path == '/node'){
$uri->setPath('/node/1');
$request->setUri($uri);
}
return parent::match($request, $pathOffset);
}
protected function buildPath(array $parts, array $mergedParams, $isOptional, $hasChild)
{
if(isset($mergedParams['link']))
{
return $mergedParams['link'];
}
return parent::buildPath($parts, $mergedParams, $isOptional, $hasChild);
}
}
我很菜鸟,我需要一些帮助来完成这部分,谢谢
im very noob and i need some help for done this part thanks
* 更新 *我想要一些喜欢的帖子Zend 框架中数据库驱动路由的教程?>
* update * i want some like post Tutorials For Database-Driven Routing in Zend Framework?
推荐答案
我的路由器如下所示:
class Content implements RouteInterface,ServiceLocatorAwareInterface
{
protected $defaults = array();
protected $routerPluginManager = null;
public function __construct(array $defaults = array())
{
$this->defaults = $defaults;
}
public function setServiceLocator(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();
}
}
我这样称呼它:
'router' => array(
'routes' => array(
'content' => array(
'type' => 'Module\Router\Content',
'options' => array(
'defaults' => array(
'controller' => 'Module\Controller\Content',
'action' => 'view'
)
)
)
)
),
在控制器中的 viewAction() 中,你可以放任何你想要的东西.我希望这会有所帮助.
In viewAction() in the controller, you can put whatever you want. I hope this helps.
(我从某人那里借用了这个解决方案,但我已经想不起来来源了.:()
(I have borrowed this solution frome somebody, but I cannot recall the source anymore. :( )
这篇关于Zend 框架 2 + 路由数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!