October CMSのMedia managerで、ログインユーザーによって2つのS3バケットを使い分けることができるようにしてみました。
環境
- Laravel:5.5
- October CMS:1.0
やったこと
システム管理者のグループの設定にある『API用の一意のコード』を取得して判定し、処理を変更するようにしました。
グループ設定
Octoberの設定画面で、今回は以下のようなグループを作成しました。
一意のコードは「another」としました。
configファイルの設定
cms.php
storageの部分は使用するS3の設定を2種類、以下のように設定しました。
'storage' => [ 'uploads' => [ 'disk' => 'local', 'folder' => 'uploads', 'path' => '/storage/app/uploads', ], 'media' => [ 'disk' => 's3', 'folder' => /media, 'path' => https://s3-ap-northeast-1.amazonaws.com/****, ], 'media_another' => [ 'disk' => 's3_another', 'folder' => /media, 'path' => https://s3-ap-northeast-1.amazonaws.com/****-another, ], ],
filesystems.php
disksの部分を同じく2種類、以下のように設定しました。
ここで設定するキーは、cms.phpで指定したdiskに合わせます。
'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 's3' => [ 'driver' => 's3', 'key' => ×××××××××××××××××, 'secret' => ×××××××××××××××××××, 'region' => ××××××××××××××, 'bucket' => ○○○○○○○○○○○○○○, 'visibility' => 'public', ], 's3_another' => [ 'driver' => 's3', 'key' => ×××××××××××××××××, 'secret' => ×××××××××××××××××××, 'region' => ××××××××××××××, 'bucket' => ***************, 'visibility' => 'public', ], ],
const.php
const.phpが無い場合は、configフォルダ配下に作成します。
グループで設定したコードを指定します。
return [ 'group_code' => 'another' ];
Media managerの処理変更
ログインユーザーに紐づいているグループから、設定した一意のコードを取得し判定、使用フォルダやパスの上書きをします。
MediaManager.php
protected function getLocalTempFilePath($fileName) { $fileName = md5($fileName . uniqid() . microtime()); $mediaFolder = Config::get('cms.storage.media.folder', 'media'); // ここから追記部分----------------------------------------------------------- $userId = BackendAuth::getUser()->id; $group = Db::table("backend_users_groups") ->join('backend_user_groups', 'backend_users_groups.user_group_id', '=', 'backend_user_groups.id') ->where('user_id', $userId)->first(); if ($group && $group->code == config('const.group_code')) { $mediaFolder = Config::get('cms.storage.media_another.folder', 'media'); } // ここまで追記部分----------------------------------------------------------- $path = temp_path() . MediaLibrary::validatePath($mediaFolder, true); if (!File::isDirectory($path)) { File::makeDirectory($path, 0777, true, true); } return $path . '/' . $fileName; }
MediaLibrary.php
protected function init() { $this->storageFolder = self::validatePath(Config::get('cms.storage.media.folder', 'media'), true); $this->storagePath = rtrim(Config::get('cms.storage.media.path', '/storage/app/media'), '/'); // ここから追記部分----------------------------------------------------------- $userId = BackendAuth::getUser()->id; $group = Db::table("backend_users_groups") ->join('backend_user_groups', 'backend_users_groups.user_group_id', '=', 'backend_user_groups.id') ->where('user_id', $userId)->first(); if ($group && $group->code == config('const.group_code')) { $this->storageFolder = self::validatePath(Config::get('cms.storage.media_another.folder', 'media'), true); $this->storagePath = rtrim(Config::get('cms.storage.media_another.path', '/storage/app/media'), '/'); } // ここまで追記部分----------------------------------------------------------- if (!starts_with($this->storagePath, ['//', 'http://', 'https://'])) { $this->storagePath = Request::getBasePath() . $this->storagePath; } $this->ignoreNames = Config::get('cms.storage.media.ignore', FileDefinitions::get('ignoreFiles')); $this->ignorePatterns = Config::get('cms.storage.media.ignorePatterns', ['^\..*']); $this->storageFolderNameLength = strlen($this->storageFolder); }
protected function getStorageDisk() { if ($this->storageDisk) { return $this->storageDisk; } $disk = Config::get('cms.storage.media.disk', 'local'); // ここから追記部分----------------------------------------------------------- $userId = BackendAuth::getUser()->id; $group = Db::table("backend_users_groups") ->join('backend_user_groups', 'backend_users_groups.user_group_id', '=', 'backend_user_groups.id') ->where('user_id', $userId)->first(); if ($group && $group->code == config('const.group_code')) { $disk = Config::get('cms.storage.media_another.disk', 'local'); } // ここまで追記部分----------------------------------------------------------- return $this->storageDisk = Storage::disk($disk); }
まとめ
今回は、ユーザーに割り振るグループが1つの場合を想定して作成しています。
2つ以上のグループを割り振るのであれば、グループ取得段階で複数グループを取得して判定する必要があります。
以上がOctober CMSのMedia managerで、ログインユーザーによって2つのS3バケットを使い分けるようにする手順でした。