Quais são as funções equivalentes que devo usar para manipulação de HTTP?

17

Observando as funções listadas na página de manipulação HTTP do Drupal 7 , notei que as seguintes funções não existem mais no Drupal 8. (Os links são para as páginas de documentação do Drupal 7, onde os links para a documentação do Drupal 8 para aqueles funções estão ausentes.)

Que funções / métodos devo usar no Drupal 8?

kiamlaluno
fonte
1
Esta é a pergunta faz parte de uma série de perguntas sobre as diferenças entre o Drupal 7 e Drupal 8.
kiamlaluno

Respostas:

16

Estas são as funções / métodos / classes que devem ser usadas no código Drupal 8.6.x.

  • drupal_access_denied()foi substituído da classe AccessDeniedHttpException . Os retornos de chamada da página que precisam retornar o erro Acesso negado devem usar código semelhante ao seguinte.

    // system_batch_page()
    public function batchPage(Request $request) {
      require_once $this->root . '/core/includes/batch.inc';
      $output = _batch_page($request);
      if ($output === FALSE) {
        throw new AccessDeniedHttpException();
      }
      elseif ($output instanceof Response) {
        return $output;
      }
      elseif (isset($output)) {
        $title = isset($output['#title']) ? $output['#title'] : NULL;
        $page = [
          '#type' => 'page',
          '#title' => $title,
          '#show_messages' => FALSE,
          'content' => $output,
        ];
    
        // Also inject title as a page header (if available).
        if ($title) {
          $page['header'] = [
            '#type' => 'page_title',
            '#title' => $title,
          ];
        }
        return $page;
      }
    }
  • Em vez de drupal_get_query_array()existir parse_query()(uma função no GuzzleHttp\Psr7espaço para nome), que faz parte do Guzzle.

  • drupal_goto()foi substituído da RedirectResponseclasse. Os retornos de chamada da página que precisam redirecionar os usuários devem usar código semelhante ao seguinte. (Observe que os manipuladores de envio de formulários não devem usar essa classe.)

    // AddSectionController::build()
    public function build(SectionStorageInterface $section_storage, $delta, $plugin_id) {
      $section_storage
        ->insertSection($delta, new Section($plugin_id));
      $this->layoutTempstoreRepository
        ->set($section_storage);
      if ($this->isAjax()) {
        return $this->rebuildAndClose($section_storage);
      }
      else {
        $url = $section_storage->getLayoutBuilderUrl();
        return new RedirectResponse($url->setAbsolute()->toString());
      }
    }
  • drupal_http_request()foi substituído por um serviço Drupal 8 que implementa a interface ClientInterface . O código Drupal 8 deve ser semelhante ao seguinte.

    // system_retrieve_file()
    try {
      $data = (string) \Drupal::httpClient()->get($url)->getBody();
      $local = $managed ? file_save_data($data, $path, $replace) : file_unmanaged_save_data($data, $path, $replace);
    } catch (RequestException $exception) {
      \Drupal::messenger()->addError(t('Failed to fetch file due to error "%error"', ['%error' => $exception->getMessage()]));
      return FALSE;
    }
  • drupal_not_found()foi substituído da classe NotFoundHttpException . Os retornos de chamada da página devem usar código semelhante ao seguinte.

    // BookController::bookExport()
    public function bookExport($type, NodeInterface $node) {
      $method = 'bookExport' . Container::camelize($type);
    
      // @todo Convert the custom export functionality to serializer.
      if (!method_exists($this->bookExport, $method)) {
        $this->messenger()->addStatus(t('Unknown export format.'));
        throw new NotFoundHttpException();
      }
      $exported_book = $this->bookExport->{$method}($node);
      return new Response($this->renderer->renderRoot($exported_book));
    }
  • drupal_site_offline() deve ser substituído por um assinante de evento, semelhante ao seguinte.

    public static function getSubscribedEvents() {
      $events[KernelEvents::REQUEST][] = ['onKernelRequestMaintenance', 30];
      $events[KernelEvents::EXCEPTION][] = ['onKernelRequestMaintenance'];
      return $events;
    }
    
    public function onKernelRequestMaintenance(GetResponseEvent $event) {
      $request = $event->getRequest();
      $route_match = RouteMatch::createFromRequest($request);
      if ($this->maintenanceMode->applies($route_match)) {
        // Don't cache maintenance mode pages.
        \Drupal::service('page_cache_kill_switch')->trigger();
        if (!$this->maintenanceMode->exempt($this->account)) {
          // Deliver the 503 page if the site is in maintenance mode and the
          // logged in user is not allowed to bypass it.
          // If the request format is not 'html' then show default maintenance
          // mode page else show a text/plain page with maintenance message.
          if ($request->getRequestFormat() !== 'html') {
            $response = new Response($this->getSiteMaintenanceMessage(), %03, ['Content-Type' => 'text/plain']);
            $event->setResponse($response);
            return;
          }
          drupal_maintenance_theme();
          $response = $this->bareHtmlPageRenderer->renderBarePage([          '#markup' => $this->getSiteMaintenanceMessage()], $this->t('Site under maintenance'), 'maintenance_page');
          $response->setStatusCode(503);
          $event->setResponse($response);
        }
        else {
          // Display a message if the logged in user has access to the site in
          // maintenance mode. However, suppress it on the maintenance mode
          // settings page.
          if ($route_match->getRouteName() != 'system.site_maintenance_mode') {
            if ($this->account->hasPermission('administer site configuration')) {
              $this->messenger->addMessage($this
          ->t('Operating in maintenance mode. <a href=":url">Go online.</a>', [':url' => $this->urlGenerator->generate('system.site_maintenance_mode')]), 'status', FALSE);
            }
            else {
              $this->messenger->addMessage($this->t('Operating in maintenance mode.'), 'status', FALSE);
            }
          }
        }
      }
    }
    • drupal_encode_path() foi substituído por UrlHelper::encodePath()
    • drupal_get_query_parameters() foi substituído por UrlHelper::filterQueryParameters()
    • drupal_http_build_query()foi substituído por UrlHelper::buildQuery(), que será removido assim que o núcleo do Drupal exigir pelo menos PHP 5.4 (nesse ponto, será possível usá-lo diretamente http_build_query()).
    • drupal_parse_url() foi substituído por UrlHelper::parse()

Observe que, em comparação com as versões anteriores do Drupal, existem algumas mudanças importantes. Por exemplo, alguns métodos que estavam na Urlclasse foram movidos na UrlHelperclasse; algumas das classes Guzzle não são mais usadas.

kiamlaluno
fonte
Alguns dos links da API estão inoperantes.
Rudolfbyker
É provável que essas funções tenham sido removidas do núcleo do Drupal. Vou verificar quais links estão mortos e removê-los.
Kiamlaluno
Parece também que alguns dos links não são mais válidos, mas a classe / função / método ainda existe. Eles apenas alteram o formato do link ou a classe / função / método foi movida para um arquivo diferente.
Kiamlaluno