/** * Выполняет поиск маршрута и вызов обработчика в случае успеха. * * Маршруты обрабатываются в порядке их регистрации, при этом обработка * останавливается при нахождении первого подходящего маршрута. * Пример обработки ошибки маршрутизации: * $router = new Router; * $router->route(['a' => '/^help$/'], 'helpAction', 'EntityController'); * try{ * $router->run(new Call('a:')); * catch(RoutingException $e){ * echo 'Invalid action'; * return 1; * } * * @param Call $call Объект запроса. * * @throws RoutingException Выбрасывается в случае ошибки маршрутизации * (отсутствия подходящего обработчика запроса). * * @return mixed Данные, возвращаемые вызванным обработчиком. */ public function run(Call $call) { foreach ($this->map as $options) { $success = true; foreach ($options['pattern'] as $opt => $pattern) { $opt = $call->opt($opt); if (is_null($opt) || !preg_match($pattern, $opt)) { $success = false; break; } } if ($success) { return $this->call($call, $options['callback'], $options['context']); } } throw new RoutingException('Invalid call'); }