MODX Fast Router
В этом компоненте используется вот эта замечательная библиотека github.com/nikic/FastRoute.
Компонент предназначен для построение простой и легкой маршрутизации в приложении на базе MODX Revolution.
Например вы решили хранить "новости/статьи/что-то другое" в отдельной таблице, чтобы не засорять дерево в админке большим кол-вом ресурсов.
Для этого создадим новый маршрут в чанке fastrouter
.
[ ["GET","/news/{alias:[a-zA-Z0-9-]+}.html","1"] ]
где {alias:[a-zA-Z0-9-]+}
это алиас новости, например my-super-news
, [a-zA-Z0-9-]+
регулярное выражение пропускающее только символы от a до Z - в адресе, 1 - ID ресурса (так называемый контроллер, который будет обрабатывать текущий маршрут) со сниппетом который реализует вашу логику показа новости. Так же в качестве обработчика (третьего параметра в маршруте) можно указать имя сниппета.
Например, простой сниппет, получает новость по alias из базы и создает плейсхолдеры всех свойств с префиксом news.
:
<?php $key = $modx->getOption('fastrouter.paramsKey', null, 'fastrouter'); $params = isset($_REQUEST[$key]) ? $_REQUEST[$key] : array(); $alias = isset($params['alias']) ? $params['alias'] : null; if ($alias) { $news = $modx->getObject('modNews', array('alias' => $alias)); if ($news) { return $modx->setPlaceholders($news->toArray(), 'news.'); } } return '';
Объявлять маршруты нужно в чанке fastrouter в таком формате:
[ ["GET","/fastrouter/{name}/{id:[0-9]+}","1"], ["GET","/fastrouter/{id:[0-9]+}","1"], ["GET","/hello/{name:\\D+}","1"], ["GET","/some_snippet/{id}","fastrouter"], ["GET","/contact","1"] ]
- Первый параметр
GET
метод запроса, может бытьGET
,POST
. - Второй параметр
/fastrouter/{name}/{id:[0-9]+}
наш маршрут, где{name}
именованный параметр принимающий любые символы,{id:[0-9]+}
именованный параметр принимающий только цифры. Можно использовать любые валидные регулярные выражения. - Третий параметр
2
ID ресурса куда будет направлен запрос.
Если запрошенному URL не соответствует ни один объявленный маршрут, будет сгенерирована 404 ошибка.
Если использовать в качестве обработчика ID ресурса, то все именованные параметры попадут в массив fastrouter
в глобальном массиве $_REQUEST
. В нашем случае по первому маршруту, например http://site.com/fastrouter/vanchelo/10
получим вот такие данные:
var_dump($_REQUEST); Array ( [fastrouter] => Array ( [name] => vanchelo [id] => 10 ) )
В случае когда обработчиком является сниппет, все параметры будут доступны в $scriptProperties
, получить их можно будет таким образов:
$key = $modx->getOption('fastrouter.paramsKey', null, 'fastrouter'); $params = $modx->getOption($key, $scriptProperties, array()); return '<pre>' . print_r($params, true) . '</pre>';
По умолчанию имя ключа со всеми параметрами маршрута - fastrouter
.
Для задания своего ключа измените в настройках системы параметр fastrouter.paramsKey
.
Скачать готовый пакет здесь github.com/vanchelo/modxFastRouter/releases/download/1.0.2-pl/fastrouter-1.0.2-pl.transport.zip
16 Комментариев
Планов сделать грид с роутами не было
Элегантно. Я так думаю.
Типа этого:
Теперь можно задать роуты, например, так:
ГЕТом будет отдаваться ресурс 9, ПОСТом сниппет fastrouter