是否可以在FuelPHP中使用破折号路由所有URL?

问题描述:

在下面的配置中,除了指定每条路由使用控制器thisisatest的URL为this-is-a-test/action之外,还可以使用正则表达式或任何其他方法吗?我需要构建/扩展自己的Router类吗?是否可以在FuelPHP中使用破折号路由所有URL?

<?php 
return array(
    '_root_' => 'home/index', // The default route 
    '_404_' => 'error/404', // The main 404 route 

    //'hello(/:name)?' => array('welcome/hello', 'name' => 'hello') 
); 

/* end of config/routes.php */ 

我实施的方法是使用以下方法扩展\Fuel\Core\Router。路由器类使用已通过security.uri_filter中的方法从config.php传递的URI,而不是修改路由器类方法,而是让我的路由器扩展为该数组添加回调。

class Router extends \Fuel\Core\Router 
{ 
    public static function _init() 
    { 
     \Config::set('security.uri_filter', array_merge(
      \Config::get('security.uri_filter'), 
      array('\Router::hyphens_to_underscores') 
     )); 
    } 

    public static function hyphens_to_underscores($uri) 
    { 
     return str_replace('-', '_', $uri); 
    } 
} 

你可以很容易地直接通过封闭或类方法或函数的调用方式将其添加到配置阵列中app/config/config.php

这样做的缺点是/ path_to_controller/action和/ path-to-controller/action都可以工作,并且可能会导致一些重复的内容SEO问题,除非您向搜索蜘蛛指出这一点。这是假设两个路径被引用某处,即一个站点地图或<a href="">

+1

要在你的“缺点”发表评论。除非我错了,否则蜘蛛不会知道'/ path_to_controller/action'(带有下划线),除非有链接指向它或站点地图。 – JRomero 2012-07-25 20:01:34

+0

就我所知,这确实是正确的。 – 2012-07-25 20:29:08

我相信路由器类默认情况下没有功能。你确实需要扩展或创建你自己的路由器类。

您可以使用security.uri_filter配置设置。

创建一个将连字符转换为下划线的函数,就完成了。您不需要为它扩展路由器类。只需将配置中的函数名称(类别或引导中定义的函数)提供给您,您就关闭了。

+0

有趣的...将考虑它。 – JRomero 2012-07-26 20:26:35

我知道这是在事件发生后,但这是任何人在未来希望这个...

为了避免下划线和子文件夹之间的混淆我更愿意转换连字符驼峰,所以路由URL this-is-a-test到类Controller_ThisIsATest

我这样做(在FuelPHP 1.4)在fuel/app/config/config.php加入一个匿名函数在“安全”设置中的“uri_filter”:

'security' => array(
    'uri_filter' => array('htmlentities', 
     function($uri) { 
      return str_replace(' ', '', ucwords(str_replace('-', ' ', $uri))); 
     }), 
),