Zend Framework 1为路由

时间:2016-01-22 10:22:49

标签: zend-framework routing routes router

我在将自定义路由添加到应用程序时遇到问题。 Zend Framework 1:

我已经使用默认的Zend路由工作了。我有很多控制器,对于其中一些我想使用友好的URL,例如: domain.com/cities/edit/的 ID / 3 至 domain.com/cities/edit/abu-dhabi

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

我尝试通过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配置 - 请求直接进入控制器城市(不是slug)。第二个(bootstrap) - 也执行城市控制器,但默认路由不能正常工作,我无法执行: domain.com/cities/但domain.com/cities/index/有效。未定义操作的错误:

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

我可以监控控制器中的“slug”/移动检查到某个库,但我只想用路由来做 - 这对我来说看起来好多了..请问,如何解决这个问题?

使用解决方案摘要进行编辑 感谢Max 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 helper在定义的控制器上获取slug的参数。定义/计算访问slug的url代替$ this-&gt; url - 到$ this-&gt; slug,其余代码在slug helper中完成。我不确定我的解决方案是否100%确定,因为这是我第一次使用路由。

主要的是 - 我只需要将Zend_Controller_Action更改为扩展Zend_Controller_Action的Crm_Abstract。单行 - 每个控制器中没有其他自定义代码。

1 个答案:

答案 0 :(得分: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规则),但花在该问题上并解决它的时间比修改所有控制器更好......