【问题标题】:Simple rewrites in Zend FrameworkZend 框架中的简单重写
【发布时间】:2014-07-22 03:26:11
【问题描述】:

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

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

  1. .htaccess 重写
  2. 创建一个 LoginController 并将 indexAction() 重定向到 auth/login
  3. 使用 Zend_Controller_Router_Rewrite 定义我自己的路由。

如果可能的话,我宁愿把它排除在#1 之外。 #2 很容易理解,尽管它看起来像是一个 hack。它还可能用一堆 5 行的“控制器”类使代码混乱。我认为#3是要走的路,但我不完全了解如何有效地使用它。我试过Using Zend_Config with the RewriteRouter 虽然我只定义了登录路由,所以每个链接都变成了'/login'(我想我错过了默认路由)。我在我的 Bootstrap.php 中这样做了,我不确定这是否正确。

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

【问题讨论】:

    标签: php zend-framework url-rewriting


    【解决方案1】:

    对于一个明确的目的,比如你有一个 "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' => , 'action' => :

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

    在这种情况下,我可以说'default' 表示这将是 Zend/Controller/Router/Route/Module.php 中定义的默认路由

    【讨论】:

    • 根据您的指示,我已将这些行添加到我的 application/configs/application.ini 并导航到 /login 效果很好!但是,页面上的所有链接(在带有 $this-&gt;url(array('controller' =&gt; 'foo', 'action' =&gt; 'bar')) 的布局模板中生成)现在都是 /login。不过,这只发生在登录页面上,来自主页的链接(和路由)和所有其他控制器都可以正常工作。有什么想法吗?
    • 想通了,我应该使用$this-&gt;url(array('controller' =&gt; 'foo', 'action' =&gt; 'bar'), 'default')。如果第二个参数是null(或省略),则假定当前路由。
    【解决方案2】:

    以防万一您对如何在引导程序中以正确的方式进行操作感兴趣。

    如果你只有一条路线可以重写,只需添加函数:

    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/login 请求都会指向 www.your-url.com/default/auth/login(模块/控制器/操作)

    编辑:


    如果你想在视图文件中使用你的新 url,你必须使用该路由的键

    在view.phtml中

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

    第一个参数是array(),第二个是你在bootstrap中定义的key。 如果您在引导程序中将 URL 更改为 /new-login,则所有 URL 都将在视图文件中更改。

    【讨论】:

    • 感谢您的回答,它似乎与this 的工作方式相同,在 /login 页面上的所有链接都指向 /login 时出现同样奇怪的行为。有什么想法吗?
    • 你问如何将所有链接动态指向新的url??如果没有,你能解释一下你的“奇怪”行为吗?
    • 页面上的所有链接(在带有 $this->url(array('controller' => 'foo', 'action' => 'bar') 的布局模板中生成) ) 现在是 /login。这只发生在登录页面上,来自主页的链接(和路由)和所有其他控制器都可以正常工作。
    • 我编辑了我的答案,但我不知道你的代码哪里出了问题。它不在路由中,因为两个答案都是正确的。尝试设置:“$router->addDefaultRoutes();”在 _initRoute() 那是我的盲目射击......
    • 嘿。设置 "... , '默认', true ..." !!! $this->url(array('controller' => 'foo', 'action' => 'bar'), 'default', true); :D
    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多