Маршрутизация и посредники

Маршруты принимают название и 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

  1. с передачей имени класса посредника, равного имени посредника Core_Route::addGlobalMiddleware($className);
  2. с передачей имени посредника и callback-функции Core_Route::addGlobalMiddleware($name, $callable);
  3. с помещением в начало списка методом 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 с аналогичными аргументами.

Не нашли ответ на свой вопрос в документации? Направьте обращение в службу поддержки или онлайн чат.

Комментарии

  • Middleware в RestAPI

    Можно ли фильтровать параметры PATCH, POST запросов через middleware в RestAPI ?
    Если да - можете привести простой пример ?

    10.04.2025 11:06:46
    ARTATOM