
October CMSのMedia managerでユーザーによって異なるS3バケットを利用する
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バケットを使い分けるようにする手順でした。
 