ZF2:使用没有MVC的JSON-RPC?

时间:2014-05-09 23:06:42

标签: zend-framework2 json-rpc

ZF2文档以及Matthew Weier O' Phinney的博客中说明:

  

许多开发人员希望直接将其粘贴在他们的MVC应用程序中,   为了拥有漂亮的网址。但是,框架团队通常   建议不要这样做。在提供API时,您需要响应   尽快返回,基本上作为服务器   将Front Controller和MVC模式封装在他们的设计中,   没有理由重复流程和添加处理   开销。

建议您将服务器端点放在公共目录结构中。例如,您可能有/public/some-api.php实例化并运行Zend RPC Server。但是我已经创建了这个dope模块,其中我有一堆类和一个配置文件,它用于创建类的依赖注入,工厂等。

Soo ...如何在我的RPC服务器中利用该代码,而不将其放入MVC控制器?

谢谢! 亚当

1 个答案:

答案 0 :(得分:1)

我是这样做的。我将其分解为几个文件,但您可以将所有这些放在公共根目录中,例如rpc-service.php:

use Zend\ServiceManager\ServiceManager,
    Zend\Mvc\Service\ServiceManagerConfig;

class Bootstrap {
    /** @var  ServiceManager */
    private static $serviceManager;

    private static function _go() {
        chdir(dirname(__DIR__));

        require __DIR__ . '/../init_autoloader.php';

        $config = include __DIR__ . '/../config/application.config.php';

        $serviceManager = new ServiceManager(new ServiceManagerConfig());
        $serviceManager->setService('ApplicationConfig', $config);
        $serviceManager->get('ModuleManager')->loadModules();

        self::$serviceManager = $serviceManager;
    }

    /**
     * @return ServiceManager
     */
    public static function getServiceManager() {
        if (!self::$serviceManager)
            self:: _go();

        return self::$serviceManager;
    }
}

$sm = Bootstrap::getServiceManager();

use Zend\Json\Server\Server,
    Zend\Json\Server\Smd,

$jsonRpc = new Server();
$jsonRpc->setClass($sm->get('Some\Class'));
$jsonRpc->getRequest()->setVersion(Server::VERSION_2);

if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    echo $jsonRpc->getServiceMap()->setEnvelope(Smd::ENV_JSONRPC_2);
}
else {
    $jsonRpc->handle();
}

如您所见,我正在使用服务管理器!好极了。一切都在世界上。