注意点
まず初めに、他のcmsでもそうだと思いますが、ベースのテーブルに対してカラムを追加するやり方は良くないと思っています。
何らかのカラムを追加したい場合はオリジナルのテーブルを使ってjoinするやり方が良いでしょう。または、カスタムフィールド的なものがある場合は、そこにいれる。
(例外としてeccubeだけは、ベースのテーブルにカラムを追加するやり方のほうがシンプルに済む場合も多いですし、公式的にもTraitを使って、拡張できるようにする解説が出ています。)
本題
注意点ではそう書きましたが、シングルサインオンのような機能を作りたい場合は、joinさせるより、
常に1対1の関係ですし、デフォルトテーブルにシングルサインオン判定用のカラムを追加したほうが便利ですし、ログインという重要な機能において、カラムを追加するやり方を取ったほうが良いと考えました。
Drupalの既存テーブルはエンティを使って書かれているため、そのまま「hook_install」などを使って無理やりカラムを追加した場合、不具合が生じる可能性が高いと思いました。
なので、公式ドキュメントや海外の記事を探すと、「hook_entity_base_field_info」フックを利用して追加するのが良いようです。(モジュールを削除する場合は、自動的にカラムも削除されるようです。)
参考コード
/**
* Implements hook_entity_base_field_info().
*/
function line_login_entity_base_field_info(EntityTypeInterface $entity_type)
{
$fields = [];
// ユーザーエンティかチェック
if ($entity_type->id() === 'user') {
$fields['line_user_id'] = BaseFieldDefinition::create('string')
->setLabel('LINE User ID')
->setSettings([
'max_length' => 255,
])
->setDefaultValue(null)
->setRequired(false);
return $fields;
}
}
/**
* Implements hook_install().
*/
function line_login_install()
{
// データベーススキーママネージャを取得
$schema = \Drupal::database()->schema();
$table = 'users_field_data';
// テーブルにユニークキーが既に存在しない場合、追加
if ($schema->tableExists($table) && !$schema->indexExists($table, 'line_user_id_unique')) {
$schema->addUniqueKey($table, 'line_user_id_unique', ['line_user_id']);
}
}
↑エンティを使ったやり方だと、バリデーションレベルでだとユニークにできるようですが、テーブルレベルでユニークに出来ない?(やり方あるのかもしれないですが...)と思ったので、「hook_install」を使ってユニークにしています。
作ったモジュール
「hook_entity_base_field_info」を使ってLINEログインモジュールを作成