Edited at

プロパティにアクセスするとAPIからデータを取得して使うようなModelを作るプラクティス

More than 5 years have passed since last update.

例えばデータベースにTwitterIDが入っているとする。

Twitterのscreen_nameは自由に変更可能だから、DBには保存せずにAPIから取得するようにして、キャッシュが切れたら勝手に更新されるようにしたい。というケースの時。

FuelPHPでORMモデルを使った時はこういうふうに書ける。

例えばUser_ModelにORMの設定を書いて、以下のようなGetterを書く。

<?php

protected static $_twitter = array();

public function twitter() {
if(!static::$_twitter[$this->twitter_id]) {
static::$_twitter[$this->twitter_id] = \Model_Twitter::getStatus($this->twitter_id);
}

return static::$_twitter[$this->twitter_id];
}

public function & __get($property) {
if($property == 'twitter') {
return $this->twitter();
}

return parent::__get($property);
}

Model_Twitterでは、APIからユーザーのステータスを返すようなコードを適宜書いておく。

そんで、ControllerやViewから以下のようにプロパティアクセスすると、必要な時だけAPIをコールするようになる。

Hello, <?php echo \Model_User::find($user_id)->twitter->screen_name; ?>!

もちろん、Model_Twitter側ではmemcachedやRedis等を使ってAPIレスポンスをキャッシュしておく。