Маршрутизация и посредники
Маршруты принимают название и URI:
// Add robots.txt route
Core_Router::add('robots.txt', '/robots.txt')
->controller('Core_Command_Controller_Robots');
с возможностью отслеживания сегментов URI:
// Add news route
Core_Router::add('news', '/news/({path})(page-{page}/)(tag/{tag}/)')
->controller('Core_Command_Controller_News');
действием контроллера по умолчанию является show, которое может быть изменено как явно, так и сегментом URI {action}.
class Core_Command_Controller_Robots extends Core_Command_Controller
{
/**
* Default controller action
* @return Core_Response
* @hostcms-event Core_Command_Controller_Robots.onBeforeShowAction
* @hostcms-event Core_Command_Controller_Robots.onAfterShowAction
*/
public function showAction()
{
$oSite = Core_Entity::factory('Site')->getByAlias(Core::$url['host']);
$content = !is_null($oSite)
? $oSite->robots
: NULL;
Core_Event::notify(get_class($this) . '.onBeforeShowAction', $this);
$oCore_Response = new Core_Response();
Core_Page::instance()
->response($oCore_Response);
$oCore_Response->header('X-Powered-By', 'HostCMS');
if (!is_null($content))
{
$oCore_Response
->status(200)
->header('Content-Type', "text/plain; charset={$oSite->coding}")
->header('Last-Modified', gmdate('D, d M Y H:i:s', time()) . ' GMT')
->body($content);
}
else
{
$oCore_Response->status(404);
}
Core_Event::notify(get_class($this) . '.onAfterShowAction', $this, array($oCore_Response));
return $oCore_Response;
}
}
Посредники (Middleware)
Посредник предоставляет механизм для проверки и фильтрации HTTP-запросов. Посредник может быть зарегистрирован глобально для всех маршрутов методами: * доступно с версии HostCMS 7.1.4
- с передачей имени класса посредника, равного имени посредника Core_Route::addGlobalMiddleware($className);
- с передачей имени посредника и callback-функции Core_Route::addGlobalMiddleware($name, $callable);
- с помещением в начало списка методом Core_Route::prependGlobalMiddleware($className) или Core_Route::prependGlobalMiddleware($name, $callable);
Core_Router::addGlobalMiddleware('test', function(Core_Command_Controller $oController, callable $next) {
// Выполнить действие
return $next();
});
Удалить из списка глобально зарегистрированных посредников можно методом Core_Route::removeGlobalMiddleware($name), полностью очистить список глобально зарегистрированных посредников можно методом Core_Route::clearGlobalMiddleware().
посредник может выполнять работу и после обработки входящего запроса:
Core_Router::addGlobalMiddleware('test', function(Core_Command_Controller $oController, callable $next) {
$response = $next();
// Выполнить действие
return $response;
});
Назначение посредника маршруту
Назначение осуществляется методом middleware (алиас addMiddleware) с передачей имени класса посредника, равного имени посредника middleware($className) или с передачей имени посредника и callback-функции middleware($name, $callable):
class My_News_Middleware extends Core_Middleware
{
/**
* Handle
* @param Core_Command_Controller $oController
* @param callable $next
* @return callable
*/
public function handle(Core_Command_Controller $oController, callable $next)
{
// Выполнить действие
return $next();
}
}
// Add news route
Core_Router::add('news', '/news/({path})(page-{page}/)(tag/{tag}/)')
->controller('Core_Command_Controller_News')
->middleware('My_News_Middleware');
поместить в начало списка можно методом prependMiddleware с аналогичными аргументами.