Laravel 與 Google Cloud Storage_設定
Laravel 與 Google Cloud Storage_設定

Laravel 與 Google Cloud Storage_設定

Laravel 與 Google Cloud Storage_設定

最近剛開始接觸Laravel寫寫新的功能,剛好有負責處和Google Cloud Storage的串接,金魚腦如我怕三秒遺忘決定還是寫下來比較保險

套件的部分用了以下這個
spatie/laravel-google-cloud-storage

套件內容不外乎就是使用Laravel本身filesystems去處理Google Cloud Storage,其實想想也是有它的道理,畢竟你一個專案可能牽涉到儲存的地方不只一個,這時候如何好好管理就很重要了,避免後面接手的同事討厭你XD

而在過程當然多少還是要去查看laravel官網關於filesystem的部分
Laravel Filesystems


首先我們得先想好

  • 使用google cloud storage就會需要設定兩邊的連線,而相關的key是機敏資料,這個東西是絕對不可以上Github的(或許還有方法可以放上去?但這邊我不清楚比較安全的方法,所以還是會選擇不上去這條比較安全保險的做法)
  • 針對上面的安全考量,我們要怎麼把東西安全的放在程式(又或者是專案裡面就顯得很重要了)
  • 會使用套件的原因,當然第一個就是其實我們不需要從頭去造輪子,那些已經被普遍使用的套件多少已經經過很多人驗證了,目前想要需要注意的部分就是套件有沒有經過資安的驗證,畢竟我們使用別人做好的車(?)也需要知道車子的安全性, 當然還有套件有沒有人在維護,最實際考量就還有…..這個專案有多少時間給你運用

  • 安裝套件的步驟如下

  • 依照說明文件,在專案內terminal下指令(如果專案在container內記得打開XD)
    
    composer require spatie/laravel-google-cloud-storage
    ```
  • 安裝完成後我們需要設定我們使用的google cloud storage,先前往Laravel專案中的filesystems.php檔案,將說明文件中的設定增加進去
    'gcs' => [
    'driver' => 'gcs',
    'key_file_path' => env('GOOGLE_CLOUD_KEY_FILE', null), // optional: /path/to/service-account.json
    'key_file' => [], // optional: Array of data that substitutes the .json file (see below)
    'project_id' => env('GOOGLE_CLOUD_PROJECT_ID', 'your-project-id'), // optional: is included in key file
    'bucket' => env('GOOGLE_CLOUD_STORAGE_BUCKET', 'your-bucket'),
    'path_prefix' => env('GOOGLE_CLOUD_STORAGE_PATH_PREFIX', ''), // optional: /default/path/to/apply/in/bucket
    'storage_api_uri' => env('GOOGLE_CLOUD_STORAGE_API_URI', null), // see: Public URLs below
    'apiEndpoint' => env('GOOGLE_CLOUD_STORAGE_API_ENDPOINT', null), // set storageClient apiEndpoint
    'visibility' => 'public', // optional: public|private
    'visibility_handler' => null, // optional: set to \League\Flysystem\GoogleCloudStorage\UniformBucketLevelAccessVisibility::class to enable uniform bucket level access
    'metadata' => ['cacheControl'=> 'public,max-age=86400'], // optional: default metadata
    ],

當初開始處理的時候最困惑的應該是這邊,有哪些地方該寫不該寫的

首先driver是gcs這部分是沒什麼問題,假如你有多個google cloud storage要引入的話,也可以設定不同的名稱,像我原本是分了一個dev的driver出來,但跟主管討論過後覺得不需要把沒有要用的東西放到production,簡單來說driver就是當你在laravel中使用的時候用的名稱,以這邊來說便會是

  $disk = Storage::disk('gcs'); // $disk = Storage::disk([driverName]);
  ```

接下來key_file_path就是讓我最不理解的地方了,當時遇到的問題是,我設定完以後在php unit test都可以跑過測試,但是當我開始著手api的時候就爆出key file not found的錯誤訊息,再三嘗試使用絕對路徑、相對路徑都一樣失敗

這時候我突然想到,既然Laravel有切出public的資料夾,換句話說,資料夾之間或許有相關權限設定,後來使用了**storage_path**() 解決了這個問題
> **storage_path**
> Get the fully qualified path to the storage directory

簡單來說就是獲得storage資料夾的權限,當然如果有更好的方式也歡迎提出來~
### 總結設定檔需要處理的為以下部分

GOOGLE_CLOUD_KEY_FILE=
GOOGLE_CLOUD_PROJECT_ID= #使用keyfile的話可空白
GOOGLE_CLOUD_STORAGE_BUCKET=
GOOGLE_CLOUD_STORAGE_PATH_PREFIX= #如果專案有需要在特定資料夾下的話可以在這邊設定
GOOGLE_CLOUD_STORAGE_API_URI = #沒有要用就空白
GOOGLE_CLOUD_STORAGE_API_ENDPOINT= #沒有要用就空白
GOOGLE_APPLICATION_CREDENTIALS= #用keyfile就略過
GOOGLE_CLOUD_DOMAIN= #可以預設一個吐出圖片的DOMAIN



Laravel程式的部分就放在下一篇處理好了XD