Можно ли перенаправить все URL-адреса с тире в FuelPHP?

В следующей конфигурации возможно использование регулярного выражения или любого другого метода помимо указания каждого маршрута для использования контроллера 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 ответа

Решение

То, как я это реализовал, заключалось в расширении \Fuel\Core\Router используя следующее. Класс маршрутизатора работает с 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=""> и т.п.

Я считаю, что класс маршрутизатора не имеет функциональности по умолчанию. Вам действительно нужно расширить или создать свой собственный класс маршрутизатора.

Для этого вы можете использовать конфигурационный параметр security.uri_filter.

Создайте функцию, которая преобразует дефисы в подчеркивания, и все готово. Вам не нужно расширять класс маршрутизатора для этого. Просто укажите имя функции (более влажно в классе или функции, определенной в начальной загрузке) для конфигурации, и все готово.

Я знаю, что это после события, но это для всех, кто хочет этого в будущем...

Чтобы избежать путаницы между подчеркиванием и подпапками, я предпочел конвертировать дефисы в регистр верблюдов, поэтому маршрутизация URL this-is-a-test к классу Controller_ThisIsATest,

Я сделал это (в FuelPHP 1.4), добавив анонимную функцию в uri_filter в настройках безопасности в fuel/app/config/config.php:

'security' => array(
    'uri_filter' => array('htmlentities',
        function($uri) { 
            return str_replace(' ', '', ucwords(str_replace('-', ' ', $uri))); 
        }),
),
Другие вопросы по тегам