2016-01-22 68 views
0

我遇到了将自定义路由添加到我的应用程序的问题。 Zend Framework 1:Zend Framework 1为路由添加单个自定义规则

我已经在使用默认的Zend路由工作。我有很多的控制器和他们中的一些我想要使用友好的URL,例如: domain.com/cities/edit/ ID/3 到 domain.com/cities/edit/ 阿布扎比

有一些控制器切换到该网址(以该格式)。

我试图通过ini文件进行配置:

resources.router.routes.slugurl.route = /:controller/:action/:slug 

并且还通过Bootstrap方法:

protected function _initSlugRouter() 
{ 
    $this->bootstrap('FrontController'); 
    $router = $this->frontController->getRouter(); 
    $route = new Zend_Controller_Router_Route('/:controller/:action/:slug/', 
     array(
      'controller' => 'slug', 
      'action' => 'forward', 
      'slug' => ':slug' 
     ) 
    ); 
    $router->addRoute('slug',$route); 

} 

的主要问题 - 与INI配置 - 请求,直接转到控制器城市(不决高下)。第二个(引导) - 还执行了城市控制器,但默认路由不工作,因为它是,我不能够执行: domain.com/cities/但domain.com/cities/index/作品。定义如果不采取行动的错误:

Action "forward" does not exist and was not trapped in __call() 

我可以监视控制器中的“弹头” /移动检查到一些图书馆,但我想只能用路由做 - 这样看起来更适合我。请,如何解决这个问题?


编辑用的解决方案总结 感谢您最大P.有趣。我终于解决了它 - 在最后2分钟:)我在路由的application.ini中有错误的规则。现在,它的定义是:

resources.router.routes.slugurl.route = /:controller/:action/:slug 
resources.router.routes.slugurl.defaults.controller = :controller 
resources.router.routes.slugurl.defaults.action = :action 
resources.router.routes.slugurl.defaults.slug = :slug 

控制器这样的定义:

class CitiesController extends Crm_Abstract 

的Crm_Abstract具有代码:

<?php 

class Crm_Abstract extends Zend_Controller_Action { 

    public function __construct(\Zend_Controller_Request_Abstract $request, \Zend_Controller_Response_Abstract $response, array $invokeArgs = array()) { 

     $params = $request->getParams(); 

     if (!empty($params['slug'])) { 
      $modelSlug = Crm_Helper_Slug::getInstance(); 
      $parameters = $modelSlug->redirectRequest($request); 
      if ($parameters !== false) { 
       foreach ($parameters as $key => $value) { 
        $request->setParam($key, $value); 
       } 
      } 
     } 
     parent::__construct($request, $response, $invokeArgs); 

    } 

    public function __call($methodName, $args) { 

     parent::__call($methodName, $args); 
    } 


} 

嵌塞助手在规定的控制器得到蛞蝓参数。访问slug的URL被定义/计算,代替$ this-> url - 到$ this-> slug,其余代码在slug helper中完成。我不确定我的解决方案是否100%确定,因为这是我第一次使用路由。

主要的事情是 - 我只是需要改变依靠Zend_Controller_Action到Crm_Abstract延伸的依靠Zend_Controller_Action。单行 - 每个控制器中不需要额外的自定义代码。

+0

如果评论这条路线是什么错误出现URL domain.com/城市/编辑/阿布扎比? –

+0

我会添加错误,只是当我将得到有效的错误代码 - 我无法格式化它在评论:( – Mik

+0

我仍然无法理解ZF路由 - 总是只有一件事不太好 - 当我添加路由: 'resources.router.routes.slugurl.route = /:controller /:action /:slug' 'resources.router.routes.slugurl.defaults.controller =:controller' 'resources.router.routes.slugurl。 defaults.action =:action' 'resources.router.routes.slugurl.defaults.slug =:slug' 我无法访问url:domain.com/developers/ - 错误代码:Action“action”不存在并没有陷入__call() - 它看起来像添加该路由规则 - 破坏默认路由,但我希望它保持。 – Mik

回答

1

我创建了两个路径规则:

resources.router.routes.slugurl.type = "Zend_Controller_Router_Route" 
resources.router.routes.slugurl.route = /:controller/:action/:slug/ 
resources.router.routes.slugurl.defaults.module = "default" 
resources.router.routes.slugurl.defaults.controller = :controller 
resources.router.routes.slugurl.defaults.action = :action 
resources.router.routes.slugurl.defaults.slug = :slug 


resources.router.routes.plain1.route = "/:controller/:action/" 
resources.router.routes.plain1.defaults.module = "default" 
resources.router.routes.plain1.defaults.controller = "index" 
resources.router.routes.plain1.defaults.action = "index" 

而对于现在工作得很好。糟糕的事情 - 我不明白路由(htaccess的规则),但时间上的问题花费并解决它比修改所有的控制器......