【问题标题】:How do I generate an absolute url in a Zend Framework (1.11) controller action?如何在 Zend Framework (1.11) 控制器操作中生成绝对 url?
【发布时间】:2011-09-22 09:59:32
【问题描述】:

我有一个 Facebook 应用程序。
Facebook 说我需要重定向到某个 facebook url,以便用户授予应用程序权限。

我目前有一个视图 phtml 文件,以下内容可以正常工作:

<script type="text/javascript">
top.location.href = 'https://www.facebook.com/dialog/oauth?client_id=<?php echo $this->fbAppId?>&redirect_uri=<?php echo $this->serverUrl() . $this->baseUrl() . $this->url(array('controller' => 'index', 'action' => 'post-authorize'))?>&scope=publish_stream,user_birthday,user_about_me,user_activities,user_location';
</script>

但是 - 我想尝试一种不同的方法,这将节省资源和处理时间,不渲染视图,而只是通过 Location 标头进行重定向(使用重定向器操作帮助程序或任何其他操作帮助程序) .

在视图脚本中,我使用ServerUrl 视图助手来生成绝对路径。
如何在不使用视图助手的情况下在控制器中生成绝对路径?
我看不出在控制器中使用视图助手是 MVC 模式中的一个好习惯。

注意:重定向到 facebook,其中我自己的站点 url 作为 get 参数附加。所以我需要的绝对网址是我自己的,而不是 facebook。这意味着使用 setUseAbsoluteUri 方法对我没有帮助,因为它适用于 facebook url,而不是我的。

【问题讨论】:

    标签: model-view-controller zend-framework url


    【解决方案1】:

    在控制器操作中使用视图助手不会呈现视图。

    $redirectUri = $this->view->serverUrl() . $this->view->baseUrl() . $this->view->url(array('controller' => 'index', 'action' => 'post-authorize'))
    
    $fbUrl = 'https://www.facebook.com/dialog/oauth?client_id='.$this->fbAppId.'&redirect_uri='.$redirectUri.'&scope=publish_stream,user_birthday,user_about_me,user_activities,user_location';
    
    $this->_redirect($fbUrl);
    

    视图对象(不是脚本)在你的控制器中被初始化,甚至在你的动作被调用之前。

    【讨论】:

    • Fredrick,我不认为在控制器内部使用视图助手是 MVC 模式中的好习惯。如果可能的话,我宁愿避免这种妥协。
    • 模式是为了提供帮助,而不是添加障碍。糟糕的 MVC 做法是视图中的模型操作。 (那些)视图助手是 url 生成助手,它们是 View Helpers 的事实只是为了让它们在视图脚本中可用。如果您查看他们的代码,他们从不使用 View 实例。但是如果你不是一个 DRY 人,你可以在行动助手中复制他们的代码。并且不要忘记“足够好”通常已经足够好,想要每件事都绝对完美往往会导致任何事情都无法完成;)
    【解决方案2】:

    也许你可以看看视图助手的源代码以获得一些“灵感”。例如,Zend_View_Helper_BaseUrl 使用以下内容:

    Zend_Controller_Front::getInstance()->getBaseUrl();
    

    Zend_View_Helper_Url 正在使用:

    public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true)
    {
        $router = Zend_Controller_Front::getInstance()->getRouter();
        return $router->assemble($urlOptions, $name, $reset, $encode);
    }
    

    可能不像人们希望的那样内置,但它的代码并不多,所以它可能会有所帮助。

    希望对你有帮助,

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 2013-05-26
      相关资源
      最近更新 更多