4

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

<?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 */
4

4 回答 4

4

我实现这一点的方式是\Fuel\Core\Router使用以下内容进行扩展。路由器类使用已通过方法传递的 URI,security.uri_filterconfig.php不是修改路由器类方法,我让路由器扩展向该数组添加回调。

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

于 2012-07-25T19:53:14.357 回答
1

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

于 2012-07-25T19:54:39.143 回答
0

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

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

于 2012-07-26T14:34:10.090 回答
0

我知道这是在活动之后,但这是给其他任何想要在未来...

In order to avoid confusion between underscores and sub-folders I preferred to convert hyphens to camel-case, so routing URL this-is-a-test to class Controller_ThisIsATest.

I did this (in FuelPHP 1.4) by adding an anonymous function to the ‘uri_filter’ in the ‘security’ settings in fuel/app/config/config.php:

'security' => array(
    'uri_filter' => array('htmlentities',
        function($uri) { 
            return str_replace(' ', '', ucwords(str_replace('-', ' ', $uri))); 
        }),
),
于 2012-11-11T22:03:10.533 回答