10

クラスによって定義された、Webアプリと対話するためのAPIがあります。公的にアクセス可能な各メソッドは、実行する前に認証を行う必要があります。各メソッドで同じ行を何度も繰り返すのではなく、magic__call関数を使用したいと思います。ただし、これはプライベートメソッドまたは保護されたメソッドでのみ機能します。Zend_Json_Serverを使用するには、パブリックメソッドである必要があります。

class MY_Api
{
  public function __call($name, $arguments)
  {
    //code here that checks arguments for valid auth token and returns an error if false
  }

  public function myFunction($param1, $param2, $param3)
  {
    //do stuff when the user calls the myFunction and passes the parameters
    //this function must remain public so that Zend_Json_Server can parse it
    //but I want it intercepted by a magic method so that the authentication
    //can be checked and the system bails before it even gets to this function.
  }
}

これらのパブリック関数にフックして、呼び出される前に実行をキャンセルすることは可能ですか?

4

2 に答える 2

8

__call実際には、パブリックを含むすべてのメソッドで機能します。ただし、publicメソッドがすでに存在する場合に機能しない理由は、クラス外のコードがすでにpublicメンバーにアクセスできるためです。__call呼び出し元のコードからアクセスできないメンバーに対してのみ呼び出されます。

私の知る限り、ある種のデコレータパターンを使用する以外に、探していることを実行するオプションは実際にはありません。

class AuthDecorator {
    private $object;

    public function __construct($object) {
        $this->object = $object;
    }

    public function __call($method, $params) {
        //Put code for access checking here

        if($accessOk) {
            return call_user_func_array(array($this->object, $method), $params);
        }
    }
}

$api = new MY_Api();
$decoratedApi = new AuthDecorator($api);

//any calls to decoratedApi would get an auth check, and if ok, 
//go to the normal api class' function
于 2011-07-13T20:57:05.193 に答える
3

あなたが可能な解決策として私のコメントを持って行ったので、私はそれを後世のための答えにフォーマットしました:

アスペクト指向またはデコレータソリューションが機能しない場合は、認証をチェックするコードをパブリックメソッドの呼び出し元またはそれ以上に配置することで、よりフレームワークベースのソリューションを試すことができます。

于 2011-07-13T22:18:34.160 に答える