lx/sigen

此包已被废弃且不再维护。未建议替代包。

服务接口生成器

0.1 2013-12-13 14:34 UTC

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的简短描述将变为更具体的描述。

Build Status