map = $map; $this->log = $logger; } /** * Create exception when invalid HTTP method used. * * @param Http $request * @param ActionInterface $action * @throws InvalidRequestException * * @return void */ private function throwException( Http $request, ActionInterface $action ): void { $uri = $request->getRequestUri(); $method = $request->getMethod(); if ($action instanceof InterceptorInterface) { $actionClass = get_parent_class($action); } else { $actionClass = get_class($action); } $this->log->debug( "URI '$uri'' cannot be accessed with $method method ($actionClass)" ); throw new InvalidRequestException( new NotFoundException(new Phrase('Page not found.')) ); } /** * @inheritDoc */ public function validate( RequestInterface $request, ActionInterface $action ): void { if ($request instanceof Http) { $method = $request->getMethod(); $map = $this->map->getMap(); //If we don't have an interface for the HTTP method or //the action has HTTP method limitations and doesn't allow the //received one then the request is invalid. if (!array_key_exists($method, $map) || (array_intersect($map, class_implements($action, true)) && !$action instanceof $map[$method] ) ) { $this->throwException($request, $action); } } } }