Zend Framework中的简单重写

时间:2012-01-23 02:30:28

标签: php zend-framework url-rewriting

这似乎是一个非常简单的问题,但我只找到了复杂的答案。我有一个Zend Framework应用程序,需要用户登录。 loginAction()logoutAction()AuthController中定义。我希望允许用户通过http://www.example.com/login而不是http://www.example.com/auth/login登录。

我知道有很多方法可以做到这一点,我考虑的是:

  1. .htaccess rewrite
  2. 创建LoginController并将indexAction()重定向到auth / login
  3. 使用Zend_Controller_Router_Rewrite定义我自己的路由。
  4. 如果可能,我宁愿将它排除在#1之外。 #2很容易理解,虽然看起来像是一个黑客。它还可能使用一堆5行“Controller”类来混乱代码。我认为#3是要走的路,但我不完全明白如何有效地使用它。我试过Using Zend_Config with the RewriteRouter虽然我只定义了登录路由,所以每个链接都变为'/ login'(我想我错过了一条默认路由)。我在我的Bootstrap.php中做到了这一点,我不确定这是否正确。

    我缺少一个简单的方法吗?我错误地使用了#3吗?我应该阅读这方面的教程吗? (我看过Zend文档很好,但我经常发现自己在问'这个代码应该放在哪里:在控制器,模型,引导程序,其他?')

2 个答案:

答案 0 :(得分:10)

出于定义的目的,就像你有“named”路线一样,这是最简单的方法。虽然有多种方法可以实现命名路由,但最简单的方法是将它放在 application.ini中:

    // /application/configs/application.ini
    resources.router.routes.login.route = /login
    resources.router.routes.login.defaults.module = default
    resources.router.routes.login.defaults.controller = auth
    resources.router.routes.login.defaults.action = login
把它放在你的引导程序中没有错,它对我来说似乎不方便 同样这样做应该(无保证)可以防止默认路由出现任何问题。

使用url()帮助器调用路由时,务必记住使用命名路由:

<?php echo $this->url(array(), 'routeName') ?>

或者如果您需要传递正常的'controller'=&gt; ,'action'=&gt; :

<?php echo $this->url(array('controller' => 'index', 'action' => 'index'), 'default') ?>

附近,因为我在这个上下文中可以告诉'default'表示这将是 Zend / Controller / Router / Route / Module.php

中定义的默认路由

答案 1 :(得分:3)

如果您对如何以正确方式在bootstrab中执行此操作感兴趣。

如果只有一条路线需要重写,只需添加功能:

protected function _initRoute() {
    $router = Zend_Controller_Front::getInstance()->getRouter();
    $router->addRoute('login', //key of route !
        new Zend_Controller_Router_Route(
            'login', //this is url(www.url.com/login) that you want to rewrite, you can set whatever you want
            array(
                'module' => 'default',
                'controller' => 'auth',
                'action' => 'login',
            )
    ));
}

现在,每个www.your-url.com/ 登录请求都会指向 www.your-url.com/default/auth/login(模块/控制器/行动)

编辑:


如果要在视图文件中使用新网址,则必须使用该路径的密钥

在view.phtml中

 <a href="<?php echo $this->url(array(), 'login'); ?>">
   [link]
 </a>

第一个参数是array(),第二个参数是你在bootstrap中定义的键。 与在bootstrap中将URL更改为/ new-login相比,所有URL都将在视图文件中更改。