【问题标题】:Is it possible to route all URLs with dashes in FuelPHP?是否可以在 FuelPHP 中使用破折号路由所有 URL?
【发布时间】:2012-07-24 01:04:48
【问题描述】:

在下面的配置中,除了指定每个路由使用控制器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 */

【问题讨论】:

    标签: php fuelphp fuelphp-routing


    【解决方案1】:

    我知道这是在活动结束后,但这是给其他任何想在未来这样做的人...

    为了避免下划线和子文件夹之间的混淆,我更喜欢将连字符转换为驼峰式,因此将 URL this-is-a-test 路由到类 Controller_ThisIsATest

    我通过在fuel/app/config/config.php 的“安全”设置中的“uri_filter”中添加一个匿名函数来做到这一点(在 FuelPHP 1.4 中):

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

    【讨论】:

      【解决方案2】:

      我实现这个的方式是使用以下扩展\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 问题,除非您向搜索蜘蛛表明这一点。这是假设两个路径都在某处引用,即站点地图或&lt;a href=""&gt; 等。

      【讨论】:

      • 评论你的“缺点”。除非我弄错了,否则蜘蛛不会知道/path_to_controller/action(带下划线),除非有指向它的链接或在站点地图中。
      【解决方案3】:

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

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

      【讨论】:

      • 有趣的...会研究一下。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多