web-dev-qa-db-fra.com

Comment créer un objet Url à partir de l'URI du fichier public?

Comment créer un objet Url à partir d'un URI de fichier? L'utilisation de l'URI pour un fichier public comme paramètre pour Url::fromUri() donne cette erreur.

UnexpectedValueException: les URL externes n'ont pas de paramètres de route internes. dans Drupal\Core\Url-> getRouteParameters ().

$file = File::load($file_id);
$file_uri = $file->getFileUri();
$menu_link['url'] = Url::fromUri($file_uri);

Voici la classe et la méthode en question: https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/function/Url%3A%3AfromUri/8.2.x

Notez que je n'ai pas besoin d'obtenir l'URL réelle au format chaîne, je dois générer un objet Url à partir de la classe Url qui pointe vers un fichier. C'est parce que j'essaye de modifier le chemin d'un lien de menu et malheureusement ce n'est pas une simple question de fournir une chaîne URL dans Drupal 8.

C'est le code que j'utilise.

function teeprop_preprocess_menu__main(&$vars) {
  foreach($vars['items'] as $key => $menu_link) {
    if (!empty($menu_link['url']->getRouteParameters())) {
      $node_id = $menu_link['url']->getRouteParameters()['node'];
      $node_entity = Node::load($node_id);
      $node_type = $node_entity->getType();

      if ($node_type == 'pdf') {
        $file_id = $node_entity->get('field_pdf_file')->getValue()[0]['target_id'];
        $file = File::load($file_id);
//         $file_url = $file->url();
        $file_uri = $file->getFileUri();
        $vars['items'][$key]['url'] = Url::fromUri($file_uri, ['absolute' => TRUE]);
      }
    }
  }
}
4
maskedjellybean

Je crois que ce qui suit devrait faire ce dont vous avez besoin:

Url::fromUri(
  File::load(1)->url()
);

(J'ai testé cela dans une installation locale 8.4.2, et cela donne un objet Url qui peut être rendu sans erreur.)

Certes, les fonctions sont nommées de manière très trompeuse. Même si ::fromUri()sons comme il devrait accepter la valeur de retour de ::getFileUri(), à savoir public://..., Il n'accepte en fait que internal:, base:, entity: Et URL "externes".

Vous devez donc utiliser ->url() pour obtenir l'URL externe du fichier, puis la transmettre à ::fromUri().

1
Christoph Burschka