lx / sigen
此包已被废弃且不再维护。未建议替代包。
服务接口生成器
0.1
2013-12-13 14:34 UTC
Requires
- php: >=5.3.0
This package is auto-updated.
Last update: 2019-08-08 10:27:13 UTC
README
在我对一个企业PHP应用的web服务API进行开发时遇到了以下问题
如果将类或类实例注册到PHP的SoapServer中,所有公开的方法都将暴露给API。这也影响了使用PHP反射API的Zend Framework组件。
我需要能够在运行时控制方法对服务器组件的可见性。
想象一下以下用于处理不同资源的基类
abstract BaseResource {
abstract public function getResourceHandler();
/**
* Deletes the resource with the given id
*
* @param int $id Resource id
*/
public function delete($id) {
$resource_handler = $this->getResourceHandler();
if(!$resource_handler->mayBeDeleted()) {
throw new \Exception('Resource of type '.$resource_handler->getTypeDescription().' may not be deleted';
}
if(!$this->getCurrentUser()->mayDelete($resource_handler) {
throw new \Exception('You are not allowed to delete this resource';
}
return $resource_handler->deleteById($id);
}
}
一个子类可能看起来像这样
class ImageResource {
public function getResourceHandler() {
return new ImageResourceHandler();
}
}
如果将ImageResource注册到SoapServer中,所有公开的方法都将暴露,即使资源类型(例如,通常不允许删除此类资源)。
使用SIGen,可以如下重写BaseResource
abstract BaseResource {
abstract public function getResourceHandler();
/**
* Deletes the ##$resource_handler->getResourceDescription()## with the given id
*
* @expose ##$resource_handler->mayBeDeleted() && $current_user->mayDelete($resource_handler)##
* @param int $id ##$resource_handler->getResourceDescription()## id
*/
public function delete($id) {
return $this->getResourceHandler()->deleteById($id);
}
}
现在您不会将类本身注册到soap服务器,而是一个动态生成的类代理($proxy_object)
$service_object = new ImageResource();
$interface_builder = new \SIGen\InterfaceBuilder(array('resource_handler' => $service_object->getResourceHandler(), 'current_user' => $service_object->getCurrentUser()));
$proxy_object = $interface_builder->generateInstance($service_object);
$proxy_object将只包含'method',如果表达式@expose ##<有效的PHP表达式>##
返回true。同时,docblock的简短描述将变为更具体的描述。