Tenancyでマルチテナントを構築Laravelで簡単にマルチテナント環境を構築できるhyn/multi-tenantパッケージを利用して、マルチテナント環境を構築する手順を解説しています。hyn/multi-tenantパッケージでは1つのテナントに対して1つのデータベースが割り当てられます。テナントの追加時にデータベースを自動で作成してくれるのでこちらが何か処理を加えることはありません。各テナントにはサブドメインが割り当てられます。Laravelをインストールするサーバのドメインがexample.comでテナント名にtestとつけたら、test.example.comでアクセスすることができます。データベースが個別に存在するのでユーザもテナント毎に独立して管理することができます。Laravelのコードは1つなので、複数のテナントで1つのコードを共有することになります。公式をマニュアルを参考にしていますが、マニュアルは構築の流れを一貫して説明しているものではないので、参考にしたページも合わせて載せていきます。まとめ構築環境MACを利用して動作確認を行なっています。PHPは7.2以上でないとhyn/multi-tenantパッケージがインストールできません。Laravelは5.8、データベースにはMySQL5.7を使用しています。マルチテナントを実現するHynのバージョンは5.4です。Laravelのインストールcomposerを使用してLaravelのインストールを行います。通常のLaravelインストールと同じです。tenancyインストレーションインストールに関しては、マニュアルページのInstallationをクリックして表示される手順通りに実行してください。Installationデータベースの設定mysqlコマンドでMySQLに接続します。本環境ではrootユーザを使いパスワードを設定していないため下記のコマンドで接続できます。接続するユーザとパスワードは各環境に合わせてください。rootデータベースの作成tenancyデータベースを作成します。このtenancyデータベースにはテナント名やテナントの識別子などテナントの管理情報を保存します。sec)ユーザの作成MySQLへの接続用にユーザの作成を行います。名前はtenancyでパスワードは任意のものを設定してください。ここではpasswordを設定しています。sec)MySQLユーザへの権限の付与テナントごとにデータベースを作成するためデータベースの作成権限も必要となります。OPTIONで与えています。sec)database.phpファイルへの接続情報の追加tenacyデータベース用の独自のsystemを追加します。パスワードは作成したtenancyのパスワードを設定してください。],上記の設定だけではテナント毎に作成されるデータベースへの接続情報が不足していますが、テナント毎のConnectionについては自動で設定されます。そのため、テナント用の設定は必要ありません。テナントデータベースへの接続については、マニュアルの以下の文章に記述されています。runtime..envファイルからDBに関する接続の情報を削除します。database.phpファイルを開いて、DB_CONNECTIONの設定をsystemに変更します。'system'),パッケージのインストールcomposerコマンドを使ったパッケージのインストールを行います。vendor:publishコマンドを実行します。設定ファイルのtenancy.phpやマイグレーションファイルが作成されます。migrateコマンドでテーブルの作成を行います。seconds)テーブル作成後にデータベースのGUI管理ツールであるTablePlusを使ってMySQLのtenantデータベースにアクセスするとhostnamesテーブルとwebsitesテーブルが作成されていることが確認できます。作成されたテーブルの確認あわせて読みたいTablePlusをMACにインストールしMySQL,SQLite接続ここまでで初期設定は完了です。テナントの作成テナント作成時のテーブルテナントを作成すると同時にデータベースにテーブルが作成されますがテーブルを作成するためには前準備が必要となります。テナント用のテーブルを作成するマイグレーションファイルはデフォルトではmigrations/tenant以下に保存する必要があります。場所についてはマニュアルのMigrationsに記載されています。設定ファイルのtenancy.phpファイルを確認するとmigrations/tenantに設定されています。設定の上部にはこのパラメータについての説明が記述されています。database_path('migrations/tenant'),コメントについては要約するとディレクトリを指定すれば新しいテナントが作成される時にマイグレーションが実行されます。自動でマイグレーションを行わない場合はfalseを設定します。このtenantディレクトリはパッケージをインストールしても自動で存在されないので作成する必要があります。各データベースでユーザ管理を行う場合は、usersとpassword_resetsのテーブルもこのディレクトリにコピーします。tenantMySQLの文字制限の問題テナントを作成する場合は、各テナントにユニークなIDが自動的に振られます。ID)はデータベースのユーザとデータベース名に使用されます。UUIDの説明しかし、MySQLでデフォルトのランダムなUUIDで作成しようとすると32文字制限によって下記のエラーが発生します。‘424eada65b8631c43377933cdf5d1166’)上記の要件については、マニュアルの必要要件に記述されています。MySQLの文字制限についてtanacy.phpファイル内で、uuid-limit-length-to-32の設定値を変更する必要があります。true),32文字以上を持つユーザ名とデータベース名をサポートしないドライバーを使っている場合はenable(=true)に。MySQLはenable(=true)にしなければなりません。テナント作成のコード必要な設定は完了したので、テナントの作成を行います。tenantsに記述されています。テナントの作成ページ上記のそのままコピーしてweb.phpファイルにペーストします。fqdnの箇所のみ変更を行い、testをテナント名として作成します。serveコマンドで起動します。<http://127.0.0.1:8000>ブラウザからhttp://localhost:8000/create_tenantにアクセスすると新規のtenantが追加されます。TablePlusでhostnamesとwebsitesテーブルの中身を確認します。hostnamesテーブルには、fqdnのtest.localhostが追加されていることが確認できます。hostnamesテーブルを確認websitesテーブルを確認するとUUIDを確認することができます。websitesテーブルを確認このUUIDがデータベース名になっているので、MySQL上にこのUUIDの名前がついたデータベースが作成されていることを確認し接続します。usersテーブルとpassword_resetsテーブルが作成されていることも確認できます。テナントデータベースへのアクセスもう一つluceosという名前でテナントを作成してみましょう。web.phpのfqdnで設定する値を変更するだけです。'luceos.localhost';作成すれば同じようにデータベースが作成されます。テナントへの接続ブラウザを起動して、作成したluceosのURL(luceos.localhost:8000)でアクセスを行なってみましょう。Laravelのページが表示されることを確認することができます。テナントへのアクセスユーザの登録テナントごとにユーザ登録ができるのか確認するためにユーザ認証機能を追加します。make:auth各テナントのデータベースに接続するためにUserモデルにUsesTenantConnectionトレイトを追加する必要があります。Notifiable,UsesTenantConnection;トレイトについてはマニュアルのModelsに記述されています。ユーザモデルへのTraitの追加もしトレイトを忘れてユーザを登録を行なった場合は、system経由でデータベースに接続が行われるため、tenancyデータベースにusersテーブルを作成していればそこにユーザが作成されます。–database=systemを実行した時usersテーブルを作成しているので、その場合はそのテーブルにユーザが作成されます)usersテーブルがtenancyデータベースになければエラーが出力されます。テナントluceosでユーザ登録を行います。luceosのユーザ登録が画面luceosのデータベースを確認すると登録したユーザが作成されていることを確認することができます。testのデータベースのusersテーブルをみても作成したユーザ情報はありません。luceosでユーザ登録テナントtestでも同様にユーザ作成を行なってください。テナントごとにユーザを作成することができます。まとめ本文書ではマルチテナントを作成し、それぞれのデータベースのuserテーブルにユーザが登録するところまで確認することができました。このパッケージの利用を通してマルチテナントがどのように設定を行うかは理解できたのではないdしょうか。実際にこのパッケージを使ってマルチテナントを作成するためには、テナントを作成するための処理やユーザのアクセス権限などいろいろな設定を行なっていく必要があります。