使用Zend框架创建绝对URL的最佳实践是什么?

15

在使用Zend框架创建绝对URL时,有没有最佳实践?我想知道是否有一些辅助工具,或者只是将来自$_SERVER变量的方案、主机等连接起来,然后添加由Zend生成的相对路径。

5个回答

25

phpfour的方法是可以的,但你还需要检查 https://、ftp:// 和 mailto:。 :)

我更喜欢所有URL都是根绝对路径的(/files/js/jquery.js)。“hardcore zend way”的方式是:

<?php 
// document root for example.com is in /htdocs 
// but application's index.php resides in /htdocs/myapp/public
echo $this->baseUrl('css/base.css'); 
//will return /myapp/public/css/base.css

echo $this->serverUrl() . $this->baseUrl('css/base.css');
//will return http://www.example.com/myapp/public/css/base.css

echo '//' . $this->getHelper('ServerUrl')->getHost() . $this->baseUrl('css/base.css');
//will return protocol relative URL //www.example.com/myapp/public/css/base.css

1
+1,99%的时间最好使用标准方法 - Zend Framework已经为您包含了这个。如果您需要手动更改URL基础,则可以在引导程序中自行设置。 - Richard Nguyen
2
echo $this->serverUrl() . $this->baseUrl('cassbase.css');(这是使用Zend ServerUrl视图助手的绝对路径) - Mr Coder
$this->baseUrl 返回一个相对于 Web 服务器根目录的 URL,如此处所述:http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial.baseurl ,在我看来,这个答案是错误的。 - AsTeR
是的,你说得部分正确。我会尝试更新我的答案以更好地反映将返回什么。 - Tomáš Fejfar

13

没有MVC模式

echo $this->serverUrl() . $this->baseUrl('cass/base.css');

或使用 MVC

echo  $this->serverUrl() . $this->url(array('controller'=>'index','action'=>'index'),null,true);

2

在我的应用程序中,我在应用程序配置中保存了一个“baseUrl”,并在引导时将其分配给注册表。稍后,我使用以下视图助手生成URL:

<?php

class Zend_View_Helper_UrlMap
{
    public function UrlMap($original)
    {
        $newUrl  = $original;
        $baseUrl = Zend_Registry::get('baseUrl');

        if (strpos($newUrl, "http://") === false) {
            $newUrl = $baseUrl . $newUrl;
        }

        return $newUrl;
    }
}

优点:我可以在一个地方更改视图中的所有URL。

希望这有所帮助。


2
Zend_Registry 是相当不必要的。一个更好的方法是使用 Zend_Controller_Front::setBaseUrl()Zend_Controller_Front::getBaseUrl()。这样,您还可以使用包含的视图助手,因此您不必自己编写。 - Richard Nguyen

0
我不会使用 $_SERVER,而是会使用 Zend_Controller_Request_Http::getServer($keyName); 中的值(或者在适用时直接使用请求对象上的获取器——我忘记哪些是对象的直接成员,哪些需要使用 getServer 访问)。从技术上讲,这些值是完全相同的,但我认为最好按照 Zend 的方式来访问它们,而不是使用原始的 PHP 访问方式。但是将它们连接起来应该能够得到您所需的内容。这实际上是我为 SSL 控制器插件/URL 帮助程序执行此操作的方式。
当然,可能还有更好的方法......

0
请使用以下方法:

<a href="<?php echo $this->serverUrl() . $this->url('application', ['action' => 'detail']) ?>">


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接