[CakePHP] HTMLヘルパーのlinkメソッドに相対パスを与えると、パス名の前にコントローラ名が付加される。
事象
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の前にコントローラ名が付加されます。