Выполнить обратный вызов до и после каждого вызова метода экземпляра? - PullRequest
0 голосов
/ 16 января 2012

У меня есть общая $sdk ссылка на объект (это Facebook PHP SDK) между многими объектами. Мне нужно сохранить маркер доступа в самом начале вызова функции и восстановить после $this->sdk->api вызова. Смотрите, например, getAlbums() function.

Как автоматически выполнить обратный вызов до / после каждый вызов функции в каждом FBItem экземпляре?

abstract class Item
{
   protected $id, $sdk, $auth;    

   public function __construct(Facebook $sdk, $auth = null)
   {   $this->sdk = $sdk; $this->auth = $auth;   }

   public function getAlbums() // Require access token change
   {
       // Am i FBUser or FBPage? Call setAccessToken to set auth
       $backup = $this->sdk->getAccessToken();
       $this->sdk->setAccessToken($auth ?: $backup);

       $as = array();
       $rs = $this->sdk->api(sprintf('/%s/albums', $this->id));
       foreach($rs['data'] as $i) $as[] = new Album($this->sdk, $this->auth);

       // Restore previous token backup
       $this->sdk->setAccessToken($backup);
   }

}

class User extends Item
{
   $ps = array(); $rs = $this->sdk->api(sprintf('/%s/accounts', $this->id));

   foreach($rs['data'] as $i) $ps[] = new Page($this->sdk, $i['access_token']);

   return $ps;
}

class Page extends Item { }

1 Ответ

2 голосов
/ 16 января 2012

Вероятно, единственный способ (без использования руткита php или переписывания целых классов) - подготовить обертку, такую ​​как эта:

class FBItemWrapper {
    public $item = new FBItem();

    public function __call( $functionName, $args){
        // Pre callback
        $result = call_user_func_array( array( $this->item, $functionName), $args);
        // Post callback
        return $result;
    }
}

Вы можете установить объект динамически, так что одного Обертки будет достаточно для всего.

...