У меня был такой же вопрос. Код не выполнен при выполнении метода «существует». После дня отладки и исследований я нашел article, где вместо вызова статического метода автор получает URL-адрес непосредственно из «Клиент». Этот подход заставил меня переписать небольшой код.
Мой старый код:
/**
* Check if file exists in storage and return full URL or $default value.
*
* @param $path
* @param string $default
* @return string
*/
public static function getStorageUrl($path, $default = '')
{
return Storage::exists($path) ? Storage::url($path) : $default;
}
Новая версия:
/**
* Check if file exists in storage and return full URL or $default value.
*
* @param $path
* @param string $default
* @return string
*/
public static function getStorageUrl($path, $default = '')
{
/**
* @var $storage FilesystemAdapter
*/
$storage = Storage::disk('s3');
return $storage->getDriver()->has($path)
? $storage->url($path)
: $default;
}
Update: в некоторых местах (с более глубокой вложенности) новая версия кода также не работает. Насколько я понимаю, код должен иметь как можно меньше вложенных слоев кода (классы, функции). Поэтому, чтобы заставить его работать, я снова переписал его с меньшим количеством гнезд:
/**
* Check if file exists in storage and return full URL or $default value.
*
* @param $path
* @param string $default
* @return string
*/
public static function getStorageUrl($path, $default = '')
{
/**
* @var $storage FilesystemAdapter
* @var $adapter AwsS3Adapter
* @var $client S3Client
*/
$storage = Storage::disk('s3');
$adapter = $storage->getDriver()->getAdapter();
$client = $adapter->getClient();
return $adapter->has($path)
? $client->getObjectUrl(env('S3_BUCKET'), $path)
: $default;
}