2016-03-03 50 views
0

我有一個循環設置來獲取函數來獲取基於id和類型的圖像。不知道我做錯了什麼,循環可能是。Laravel存儲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

我有同樣的問題。代碼執行「exists」方法失敗。經過一天的調試和研究,我發現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; 
} 

更新:在一些地方(有更深層次的嵌套)的代碼,新版本還沒有工作。據我所知,代碼應該有儘可能少的嵌套層次的代碼(類,函數)。所以爲了使它工作,我再次用少嵌套重寫它:

/** 
* 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; 
}