是否可以在 FuelPHP 中路由所有带有破折号的 URL?
-
11-12-2019 - |
题
在下面的配置中,除了指定每个路由使用控制器之外,是否可以使用正则表达式或任何其他方法 thisisatest
当网址为 this-is-a-test/action
?我必须构建/扩展我自己的 Router 类吗?
<?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 已通过中的方法传递 security.uri_filter
从 config.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="">
ETC。
其他提示
我相信路由器类默认情况下不具备该功能。您确实需要扩展或创建自己的路由器类。
您可以使用 security.uri_filter 配置设置。
创建一个将连字符转换为下划线的函数,就完成了。您不需要为其扩展路由器类。只需向配置提供函数名称(无论是在类中还是在引导程序中定义的函数),就可以了。
我知道这是在活动结束后,但这是为将来想要这个的人准备的......
为了避免下划线和子文件夹之间的混淆,我更喜欢将连字符转换为驼峰式大小写,因此路由 URL this-is-a-test
去上课 Controller_ThisIsATest
.
我通过在“安全”设置中的“uri_filter”中添加一个匿名函数来做到这一点(在 FuelPHP 1.4 中) fuel/app/config/config.php
:
'security' => array(
'uri_filter' => array('htmlentities',
function($uri) {
return str_replace(' ', '', ucwords(str_replace('-', ' ', $uri)));
}),
),