2016-03-03 5 views
0

У меня есть настройка цикла для извлечения функции для получения изображения на основе идентификатора и типа. Не уверен, что я делаю неправильно, петля, вероятно.Laravel Storage S3 вызывает прерывание уровня вложенности

Я могу сохранить файлы на S3 без каких-либо проблем.

Helpers.php

use Storage; 
// 
public static function getImage($id, $type) 
{ 
    if(Storage::disk('s3')->exists('/images/' . $type . '/' . $id . '.png')) 
    { 
     return Storage::disk('s3')->get('/images/' . $type . '/' . $id . '.png'); 
    } 
} 

причины:

FatalErrorException in Uri.php line 521: 
Maximum function nesting level of '100' reached, aborting! 

ответ

0

У меня был такой же вопрос. Код не выполнен при выполнении метода «существует». После дня отладки и исследований я нашел 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; 
} 
Смежные вопросы