Как игнорировать / пропускать функции и методы при использовании Reflection в Zend - PullRequest
1 голос
/ 17 августа 2011

Я создаю многопротокольный веб-сервис, используя Zend_JSON_Server и Zend_XmlRpc_Server, используя PHP 5.2.6.и в настоящее время я сталкиваюсь с проблемой, что сервер теперь объявляет каждый отдельный метод от моих классов и его родителей.

class MyClass extends MyInterface {
  /**
   * To be published and accessible
   **/
  public function externalUse() {}
}

class MyInterface {
  /**
   * This method should not be published using the webservice,
   * but needs to be of type "public" for internal use
   * @access private
   * @ignore
   **/
   public function internalUseOnly() {}
}

$server = new Zend_Json_Server();
$server->setClass('MyClass');

// show service map
header('Content-Type: text/plain');
$server->setTarget('/service.json')
       ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);

$smd = $server->getServiceMap();
die($smd);

Этот код также объявляет internalUseOnly как доступную функцию, используя веб-сервис:

{ "SMDVersion" : "2.0",
  "contentType" : "application/json",
  "envelope" : "JSON-RPC-2.0",
  "methods" : { "externalUse" : { "envelope" : "JSON-RPC-2.0",
          "parameters" : [  ],
          "returns" : "null",
          "transport" : "POST"
        },
      "internalUseOnly" : { "envelope" : "JSON-RPC-2.0",
          "parameters" : [  ],
          "returns" : "null",
          "transport" : "POST"
        }
    },
  "services" : { "externalUse" : { "envelope" : "JSON-RPC-2.0",
          "parameters" : [  ],
          "returns" : "null",
          "transport" : "POST"
        },
      "internalUseOnly" : { "envelope" : "JSON-RPC-2.0",
          "parameters" : [  ],
          "returns" : "null",
          "transport" : "POST"
        }
    },
  "target" : "/service.json",
  "transport" : "POST"
}

Как видите, я уже пробовал @ignore и @access private, но оба игнорируются Reflection.Есть ли другой способ удалить такие функции из моей карты услуг?

Заранее спасибо!


Обновление

Одно решение, которое я нашел, состоит в том, чтобы сделать частные / защищенные методы снова доступными с помощью перегрузки и динамических вызовов функций.Но так как call_user_func не известен как один из самых быстрых методов, это только исправление.

class MyInterface {
    public function __call($method, $params) {
        $method = '_' . $method;
        if (method_exists($this, $method)) {
            call_user_func(array($this, $method), $params);
        }
    }

  /**
   * This method should not be published using the webservice,
   * but needs to be of type "public" for internal use
   * @ignore
   * @access private
   * @internal
   **/
  protected function _internalUseOnly() { die('internal use only!'); }
}

1 Ответ

0 голосов
/ 14 октября 2012

Префикс ваших методов с __. Zend \ Server \ Reflection \ ReflectionClass игнорирует методы, начинающиеся с __. По крайней мере, в ZF2.

...