¿Cuáles son las funciones equivalentes que debo usar para el manejo de HTTP?

17

Al observar las funciones enumeradas en la página de manejo de HTTP para Drupal 7 , noté que las siguientes funciones ya no existen en Drupal 8. (Los enlaces son para las páginas de documentación de Drupal 7, donde los enlaces a la documentación de Drupal 8 para esos faltan funciones).

¿Qué funciones / métodos debería usar en su lugar en Drupal 8?

kiamlaluno
fuente
1
Esta pregunta es parte de una serie de preguntas sobre las diferencias entre Drupal 7 y Drupal 8.
kiamlaluno

Respuestas:

16

Estas son las funciones / métodos / clases que deben usarse en el código Drupal 8.6.x.

  • drupal_access_denied()ha sido reemplazado de la clase AccessDeniedHttpException . Las devoluciones de llamada de página que necesitan devolver el error de acceso denegado deben usar un código similar al siguiente.

    // 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;
      }
    }
  • En lugar de drupal_get_query_array()existe parse_query()(una función en el GuzzleHttp\Psr7espacio de nombres), que es parte de Guzzle.

  • drupal_goto()ha sido reemplazado de la RedirectResponseclase. Las devoluciones de llamada de página que necesitan redirigir a los usuarios deben usar un código similar al siguiente. (Tenga en cuenta que los controladores de envío de formularios no deben usar esta clase).

    // 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()ha sido reemplazado de un servicio Drupal 8 que implementa la interfaz ClientInterface . El código Drupal 8 debe ser similar al siguiente.

    // 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()ha sido reemplazado de la clase NotFoundHttpException . Las devoluciones de llamada de página deben usar un código similar al siguiente.

    // 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() debe ser reemplazado por un suscriptor de eventos, similar al siguiente.

    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() ha sido reemplazado por UrlHelper::encodePath()
    • drupal_get_query_parameters() ha sido reemplazado por UrlHelper::filterQueryParameters()
    • drupal_http_build_query()ha sido reemplazado por UrlHelper::buildQuery(), que se eliminará una vez que el núcleo de Drupal requiera al menos PHP 5.4 (en ese momento, será posible usarlo directamente http_build_query()).
    • drupal_parse_url() ha sido reemplazado por UrlHelper::parse()

Tenga en cuenta que, en comparación con versiones anteriores de Drupal, hay algunos cambios importantes. Por ejemplo, algunos métodos que estaban en la Urlclase se han movido en la UrlHelperclase; algunas de las clases de Guzzle ya no se usan.

kiamlaluno
fuente
Algunos de los enlaces de la API están muertos.
rudolfbyker
Es probable que esas funciones se hayan eliminado del núcleo de Drupal. Comprobaré qué enlaces están muertos y los eliminaré.
kiamlaluno
También parece que algunos de los enlaces ya no son válidos, pero la clase / función / método todavía existe. Simplemente cambian el formato del enlace, o la clase / función / método se ha movido a un archivo diferente.
kiamlaluno