web-dev-qa-db-ja.com

ユーザーオブジェクトに変数を設定する推奨される方法

ユーザーアカウントのフィールドを使用して、いくつかのユーザー変数を格納しています。これらの変数には、ユーザーはアクセスできません。変数にアクセスするために、すべてのページでuser_loadを使用する効率を心配しています。多分それはvariable_set()を使用する方が良いですか? drupalで変数を設定/アクセスするための推奨手順は何ですか?

3
Mike

効率が目標であり、変数が複雑すぎない場合は、ユーザーエンティティのdataプロパティを利用できます。これは、シリアル化された文字列として_{users}_テーブルに格納され、デフォルトでグローバル_$user_オブジェクトの一部として使用できます。あらゆるタイプのユーザーロード(最低限のユーザーロードであっても)のためにデータベースから読み込まれるため、オーバーヘッドを基本的に何も減らすことができます。

それを使用する方法の最良の例は hook_user_presave() のドキュメントにあります:

_function hook_user_presave(&$edit, $account, $category) {
  // Make sure that our form value 'mymodule_foo' is stored as
  // 'mymodule_bar' in the 'data' (serialized) column.
  if (isset($edit['mymodule_foo'])) {
    $edit['data']['mymodule_bar'] = $edit['mymodule_foo'];
  }
}
_

次に、コードの別のポイントで値を取得するのは、次のように簡単です。

_global $user;
$mymodule_bar = $user->data['mymodule_bar'];
_

フィールドは素晴らしいですが、ご存知のようにオーバーヘッドが増えるため、少量のデータの場合、このようにdataプロパティを使用しない理由はわかりません。

変数テーブルを使用すると、すぐに管理できなくなると思います。ユーザーごとに異なる変数になるか、すべてのユーザーのデータを含む単一の変数を保存する必要があります...どちらも望ましいことではありません。

3
Clive