是否可以在FuelPHP中用短划线路由所有URL


Is it possible to route all URLs with dashes in FuelPHP?

在以下配置中,当URL为this-is-a-test/action时,除了指定每个路由使用控制器thisisatest之外,是否可以使用正则表达式或任何其他方法?我是否必须构建/扩展我自己的路由器类?

<?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。路由器类使用一个URI,该URI已从config.php通过security.uri_filter中的方法传递,因此我没有修改路由器类方法,而是让我的路由器扩展为该数组添加了一个回调。

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="">等。

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

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

创建一个将连字符转换为下划线的函数,就完成了。你不需要为它扩展路由器类。只需将函数名(无论是在类中还是在引导程序中定义的函数)提供给配置,就可以关闭了。

我知道这是在事件之后,但这是为将来想要这样做的人准备的。。。

为了避免下划线和子文件夹之间的混淆,我更喜欢将连字符转换为驼色大小写,因此将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))); 
        }),
),