Меня тоже псикает эта "ошибка". 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
нотация .
Надеюсь, кто-то исправит это в ближайшем будущем или появится другой лучший способ. Если кто-то знает что-то лучше, пожалуйста, дайте мне знать в комментариях, я буду более чем рад обновить его здесь.
Информация, связанная:
Если это было полезно, не забудьте принять ответ или пролистать его.