2013-08-05 150 views
1

喜与Zend框架2 problemn我想例如Zend框架2 +路由数据库

/hello/index => is Application/Controllers/HomeController 
/CustomURL => is Application/Controllers/HomeController 

的CustomUrl我从数据库中检索创建路由数据库我这里是我的配置文件

/// 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', 
       ), 
      ), 
     ), 
     ), 
    ),.... 

这里是我的Router类

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很小白,我需要做的这部分一些帮助感谢

*更新* 我想有些像交 Tutorials For Database-Driven Routing in Zend Framework?

+0

我真的没有了解清楚你问什么,我以为是你要创建这样的路由如果它不符合你的“/节点”路线,它必须重定向到某个XYZ页面? –

+0

是的,我想创建一个路由,但通过数据库 – user2646690

回答

1

我的路由器是这样的:

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()中,你可以放任何你想要的东西。 我希望这可以帮助。

(我借这个解决方案弗罗姆人,但我不能再回忆的源泉。:()

+2

我相信它来自这里:http://www.zendexperts.com/2012/12/09 /定制路由功能于Zend的框架-2 / –