如何在Zend Framework(1.11)控制器操作中生成绝对URL?

时间:2011-09-22 09:59:33

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

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

我目前有一个查看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网址上运行,而不是我的。

2 个答案:

答案 0 :(得分:5)

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

$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);

在调用操作之前,无论如何都会在控制器中初始化View对象(而不是脚本)。

答案 1 :(得分:1)

也许您可以查看视图助手的源代码以获得一些“灵感”。例如,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);
}

可能不像人们想要的那样内置,但它不是很多代码,所以它可能会有所帮助。

希望有所帮助,