Chris@0: renderer = $renderer; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public static function create(ContainerInterface $container) { Chris@0: return new static( Chris@0: $container->get('renderer') Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the requested rendered contextual links. Chris@0: * Chris@0: * Given a list of contextual links IDs, render them. Hence this must be Chris@0: * robust to handle arbitrary input. Chris@0: * Chris@17: * @param \Symfony\Component\HttpFoundation\Request $request Chris@17: * The Symfony request object. Chris@0: * Chris@0: * @return \Symfony\Component\HttpFoundation\JsonResponse Chris@0: * The JSON response. Chris@17: * Chris@17: * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException Chris@17: * Thrown when the request contains no ids. Chris@17: * Chris@17: * @see contextual_preprocess() Chris@0: */ Chris@0: public function render(Request $request) { Chris@0: $ids = $request->request->get('ids'); Chris@0: if (!isset($ids)) { Chris@0: throw new BadRequestHttpException(t('No contextual ids specified.')); Chris@0: } Chris@0: Chris@17: $tokens = $request->request->get('tokens'); Chris@17: if (!isset($tokens)) { Chris@17: throw new BadRequestHttpException(t('No contextual ID tokens specified.')); Chris@17: } Chris@17: Chris@0: $rendered = []; Chris@17: foreach ($ids as $key => $id) { Chris@17: if (!isset($tokens[$key]) || !Crypt::hashEquals($tokens[$key], Crypt::hmacBase64($id, Settings::getHashSalt() . \Drupal::service('private_key')->get()))) { Chris@17: throw new BadRequestHttpException('Invalid contextual ID specified.'); Chris@17: } Chris@0: $element = [ Chris@0: '#type' => 'contextual_links', Chris@0: '#contextual_links' => _contextual_id_to_links($id), Chris@0: ]; Chris@0: $rendered[$id] = $this->renderer->renderRoot($element); Chris@0: } Chris@0: Chris@0: return new JsonResponse($rendered); Chris@0: } Chris@0: Chris@0: }