Можно ли перенаправить все 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)));
}),
),