質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

1回答

625閲覧

ログイン時のidによってデータベースやアップロードファイル格納時のパスを切り替えたい

taiyo-2017

総合スコア49

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

0クリップ

投稿2020/06/03 07:25

編集2020/06/03 07:26

cakephp3を使用してシステムを作成しています。

ログイン画面でログインを行い、
ユーザーが登録されている場合にログイン後のページへ遷移するような画面があります。

データベースやファイルアップロード時のフォルダのパスは複数の団体ごとにわけて管理をしますが、
システム自体は1つのため、ログイン画面のurlを「https://teratail.com/?id=1」「https://teratail.com/?id=2」
のように「id」を設定することでどの団体かを判断するようにしようとしています。

その場合、idが1の団体はAAAのデータベースを使用する、
idが2の団体はBBBのデータベースを使用する、というような仕組みの実装方法が分かりません。

https://wakubeku.com/?p=65
サーバが異なる場合、こちらのサイトを参考に、
下記のように「app.php」でデータベースの繋ぐ先を複数設定できることは分かりました。

php

1public static function defaultConnectionName() 2{ 3 return empty(env('CAKEPHP_ENV'))?'default':env('CAKEPHP_ENV'); 4}

php

1 'Datasources' => [ 2 'aaa' => [ 3 'className' => Connection::class, 4 'driver' => Mysql::class, 5 'persistent' => false, 6 'host' => 'localhost', 7 //'port' => 'non_standard_port_number', 8 'username' => 'my_app', 9 'password' => 'secret', 10 'database' => 'AAA', 11 //'encoding' => 'utf8mb4', 12 'timezone' => '+09:00', 13 'cacheMetadata' => true, 14 'quoteIdentifiers' => false, 15 'log' => false, 16 //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], 17 'url' => env('DATABASE_TEST_URL', null), 18 ], 19 /** 20 * The test connection is used during the test suite. 21 */ 22 'bbb' => [ 23 'className' => Connection::class, 24 'driver' => Mysql::class, 25 'persistent' => false, 26 'host' => 'localhost', 27 //'port' => 'non_standard_port_number', 28 'username' => 'my_app', 29 'password' => 'secret', 30 'database' => 'BBB', 31 //'encoding' => 'utf8mb4', 32 'timezone' => '+09:00', 33 'cacheMetadata' => true, 34 'quoteIdentifiers' => false, 35 'log' => false, 36 //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], 37 'url' => env('DATABASE_TEST_URL', null), 38 ],

ですが、今回のシステムではどの団体も接続するサーバは同じため、
下記のように判断するのかなと考えています。

php

1public static function defaultConnectionName() 2{ 3 // idを取得する処理 4 5 $database = "default"; 6 if (『idが1の場合』) { 7 $database = "aaa"; 8 } else if(『idが2の場合』) { 9 $database = "bbb"; 10 } 11 return $database; 12}

ですが、controllerでなくTableクラスでidを取得する方法も分からず、
さらに全てのTableでオーバーライドを行うのも手間のように思っています。
envファイルや「path.php」などで共通で切り替えを行うようなことはできないのでしょうか?
データベースだけでなく、「path.php」のパスについても一括で切り替えを行うような仕組み、などはありますでしょうか?
アドバイスいただければと思います。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ログインユーザーによるDB切替えは行ったことがありませんが、サブドメインベースによる切替えなら行ったことがあります。
そのときはMiddlewareでサブドメインを取得し、Cake\Datasource\ConnectionManagerでデータベースの接続先を変更していました。

接続先の切替え部分は、以下のようなコードになります。

php

1 // ユーザーごとのDB接続は 'some' を使用している前提 2 $original = ConnectionManager::getConfig('some'); 3 $changed = array_merge($original, [ 4 'host' => $alterHost, 5 'database' => $alterDatabase, 6 'username' => $alterUsername, 7 'password' => $alterPassword, 8 ]); 9 ConnectionManager::drop('some'); 10 ConnectionManager::setConfig('some', $changed); 11 12 TableRegistry::getTableLocator()->clear(); // もし、既にテーブルクラスがロードされていたら接続先切替え前のままなのでクリアする

$alter~ の接続先情報はマスタのユーザー情報から取得する感じですね。

DB設定の切替えは早い段階で行った方が問題が起きにくいと思いますので、Middleware層で行うのが好ましいと考えます。

ファイルの出力先については、path.phpの書き換えは難しいので、書き出し先パスをConfigureあたりで持つようにして、ユーザーごとに書き換え、それを利用すれば良いでしょう。

投稿2020/06/09 09:51

nojimage

総合スコア957

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taiyo-2017

2020/06/25 02:18

回答ありがとうございます。 Cake\Datasource\ConnectionManagerで接続先を変えていくことが可能なのですね。 参考にさせていただきます。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問