web-dev-qa-db-ja.com

パブリックファイルURIからUrlオブジェクトを作成するにはどうすればよいですか?

ファイルURIからUrlオブジェクトを作成するにはどうすればよいですか?パブリックファイルのURIをUrl::fromUri()のパラメーターとして使用すると、このエラーが発生します。

UnexpectedValueException:外部URLには内部ルートパラメータがありません。 Drupal\Core\Url-> getRouteParameters()にあります。

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

ここに問題のクラスとメソッドがあります: https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/function/Url%3A%3AfromUri/8.2.x

実際のURLを文字列形式で取得する必要はありません。ファイルを指すUrlクラスからUrlオブジェクトを生成する必要があることに注意してください。これは、メニューリンクのパスを変更しようとしているためです。残念ながら、これはDrupal 8。

これは私が使用しているコードです。

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

私は以下があなたが必要とすることをするべきだと信じています:

_Url::fromUri(
  File::load(1)->url()
);
_

(私はこれをローカルの8.4.2インストールでテストし、エラーなしでレンダリングできるUrlオブジェクトを生成します。)

関数は確かに非常に誤解を招くように命名されています。 ::fromUri()soundsは、::getFileUri()の戻り値、つまり_public://..._を受け入れる必要があるように、実際には_internal:_のみを受け入れます。 _base:_、_entity:_、および「外部」URL。

したがって、->url()を使用してファイルの外部URLを取得し、それを::fromUri()に渡す必要があります。

1