[CakePHP] HTMLヘルパーのlinkメソッドに相対パスを与えると、パス名の前にコントローラ名が付加される。

環境

この記事の内容は、Ubuntu 6.10, Apache 2.0.55, PHP 5.1.6, CakePHP 1.1.12.4205で確認しました。

事象

accountsコントローラでビューを出力したとき、

<?php $html->link('New Account', '/accounts/add'); ?>

とすると、生成されるリンクは、

<a href="foo/accounts/add">New Account</a>

となり、

<?php $html->link('New Account', 'accounts/add'); ?>

とすると、生成されるリンクは、

<a href="foo/accounts/accounts/add">New Account</a>

となります。

詳細

HTMLヘルパーはcake/libs/view/helpers/html.phpであり、linkメソッドをみると、

<?php
(略)
    function link($title, $url = null, $htmlAttributes = array(), $confirmMessage = false, $escapeTitle = true, $return = false) {
(略)
            $output = sprintf($this->tags['link'], $this->url($url, true), $this->_parseAttributes($htmlAttributes), $title);
(略)
    }
(略)
?>

とあります。ここで、$this->tags['link']は、"<a href="%s" %s>%s</a>"です。$this->urlが呼ばれているのでこのメソッドをみると、

<?php
(略)
    function url($url = null, $return = false) {
(略)
        if (empty($url)) {
            return $this->here;
        } elseif($url{0} == '/') {
            $output = $base . $url;
        } else {
            $output = $base . '/' . Inflector::underscore($this->params['controller']) . '/' . $url;
        }

        return $this->output($output, $return);
    }
(略)
?>

とあります。$urlの先頭に"/"がない場合、else句が実行され、$urlの前にコントローラ名が付加されます。