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バケットを使い分けるようにする手順でした。


--------------------------
システム開発のご要望・ご相談はこちらから

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です