Laravel s3 Хранение: неопределенный метод 'url' - PullRequest
2 голосов
/ 10 января 2020

Я новичок в использовании amazon s3 с laravel, и у меня возникают проблемы с вызовом метода url () для получения полного URL-адреса из файла s3.

Я на Laravel версии 5.8.29 и у меня установлены соответствующие composer пакеты для s3

. Я тестирую получение URL после загрузки файла в корзину. загрузка прошла успешно.

use Illuminate\Support\Facades\Storage;

$url = Storage::url('file.jpg');

$url = Storage::disk('s3')->url('image.png');

с использованием Storage :: url ('file.jpg') в порядке, но

с использованием Storage :: disk ('s3') -> url ('image .png '), и я получу сообщение об ошибке "неопределенный метод' url '", хотя он находится в laravel официальных документах, и я не уверен, почему.

1 Ответ

1 голос
/ 23 апреля 2020

Меня тоже псикает эта "ошибка". VSCode и Intelephense продолжают говорить Undefined method 'url' для любого Storage::disk('s3')->url('path.ext');, даже зная, что это метод, предложенный для Laravel файлового хранилища документов . Для документов, указанных c до 5.8, смотрите здесь .

Очевидно, есть несколько способов справиться с этим, и я не уверен, какой из них будет правильным выбором без изменив Laravel сам. Я скажу вам, что я считаю лучшим, по крайней мере для меня, поскольку я пытаюсь решить ту же самую проблему.

Некоторые из предложенных здесь способов:

  • Используйте облачную файловую систему по умолчанию, вот так :

    Storage::cloud()->url('filename.ext');
    

    Но я признаю, что мне это не нравится, так как я предпочитаю указывать имя диска. Помните, что для этого вам нужно определить конфигурацию cloud в config/filesystems.php, например: 'cloud' => env('FILESYSTEM_CLOUD', 's3'). Но если есть что-то, чему мы можем научиться с помощью метода cloud, это то, что он возвращает правильный тип IDE, когда читает код (и мы будем использовать это).

  • Согласно методу cloud, приведенному выше, возвращается \Illuminate\Filesystem\FilesystemManager. Таким образом, мы можем использовать это, чтобы указать это в переменном комментарии, например:

    /** @var \Illuminate\Filesystem\FilesystemManager $disk */
    $disk = Storage::disk('s3');
    $url = $disk->url('filename.ext');
    

    Грег упомянул, что здесь . Мне очень нравится эта реализация, и я, вероятно, буду использовать это. Помните, что вы также всегда можете создать метод для возврата в любом месте, чтобы избежать повторения кода:

    /**
     * Return the s3 storage disk.
     *
     * @return \Illuminate\Filesystem\FilesystemAdapter 
     */
    private function getDisk()
    {
        return Storage::disk('s3');
    }
    
  • Еще один надежный способ - генерировать URL-адрес напрямую с помощью некоторых более скрытых методов, Laravel используемых в table:
    $s3 = Storage::disk('s3')->getAdapter()->getClient();
    $url = $s3->getObjectUrl(env('AWS_BUCKET'), 'filename.ext');
    
    Это, вероятно, сгенерирует URL даже без необходимости устанавливать файловую систему url в конфигах, но, как прокомментировали люди, она может не работать с неопубликованными каталогами c s3. И, насколько я проверял, если у вас на конфигах установлено url, это просто отменит его. Лично, после всех этих причин, мне это не нравится.
  • Есть и другой способ, как расширение фасада, но мне тоже не нравится, и я предпочитаю не публиковать здесь sh, во-первых, потому что это слишком много кода для чего-то тривиального, во-вторых, чтобы не рекомендовать его. Но, конечно, если вы хотите иметь дело с этим централизованным способом, возможно, это путь.

Итак, как вы можете видеть, более быстрый и чистый способ в настоящее время заключается в использовании @var нотация .

Надеюсь, кто-то исправит это в ближайшем будущем или появится другой лучший способ. Если кто-то знает что-то лучше, пожалуйста, дайте мне знать в комментариях, я буду более чем рад обновить его здесь.

Информация, связанная:

Если это было полезно, не забудьте принять ответ или пролистать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...