使用HTML-Helper在CakePHP中路由子域

时间:2011-04-27 17:57:58

标签: php cakephp mobile cakephp-1.3 html-helper

我在子域“m.mydomain.com”上运行了一个移动页面。这一切都运行正常,但我想在使用子域时删除URL中的控制器。

m.mydomain.com/mobiles/tips

应该成为

m.mydomain.com/tips

使用HTML-Helper。

目前链接看起来像这样:

$html->link('MyLink', array('controller' => 'mobiles', 'action'=> 'tips'));

我尝试了几种可能的路线解决方案以及引导程序中的一些黑客攻击但是对我来说没有用。

在CakeBakery中,我找到了this,但这并没有解决我的问题。

有没有人对这个问题有所了解?

1 个答案:

答案 0 :(得分:2)

从您提到的页面收集代码:

约束:您在此设置中无法使用名为tipsfoo的控制器

/config/routes.php

$subdomain = substr( env("HTTP_HOST"), 0, strpos(env("HTTP_HOST"), ".") );

if( strlen($subdomain)>0 && $subdomain != "m" ) { 
    Router::connect('/tips',array('controller'=>'mobiles','action'=>'tips'));
    Router::connect('/foo', array('controller'=>'mobiles','action'=>'foo'));
    Configure::write('Site.type', 'mobile');
}

/* The following is available via default routes '/{:controller}/{:action}'*/
// Router::connect('/mobiles/tips', 
//                  array('controller' => 'mobiles', 'action'=>'tips'));
// Router::connect('/mobiles/foo',  
//                  array('controller' => 'mobiles', 'action'=>'foo'));

在您的Controller操作中:

$site_is_mobile = Configure::read('Site.type') ?: '';

然后在你看来:

<?php

if ( $site_is_mobile ) {
    // $html will take care of the 'm.example.com' part
    $html->link('Cool Tips', '/tips');
    $html->link('Hot Foo', '/foo');
} else {
    // $html will just output 'www.example.com' in this case
    $html->link('Cool Tips', '/mobiles/tips');
    $html->link('Hot Foo', '/mobiles/foo');
}

?>

这将允许您在视图中输出正确的链接(稍后我将向您展示如何编写更少的代码),但$html助手将无法使用 - 没有多少魔法 - 使用控制器动作路由到另一个域。请注意,就m.example.com帮助程序而言,www.example.com$html是不同的域。

现在,如果您需要,可以在控制器中执行以下操作,从视图中删除一些逻辑:

<?php

$site_is_mobile = Configure::read('Site.type') ?: '';

if ( $site_is_mobile !== '' ) {
    $tips_url = '/tips';
    $foo_url  = '/foo';
} else {
    $tips_url = '/mobile/tips';
    $foo_url  = '/mobile/foo';
}

// make "urls" available to the View
$this->set($tips_url);
$this->set($foo_url);

?>

在您看来,您无需担心通过m.example.com/tipswww.example.com/mobile/tips检查网站是否正在访问:

<?php echo $html->link("Get some kewl tips", $tips_url); ?>

有关CakePHP-1.3中更高级的路由,请参阅Mark Story's article on custom Route classes

告诉我们;)