【问题标题】:ZF2: Using JSON-RPC without MVC?ZF2:在没有 MVC 的情况下使用 JSON-RPC?
【发布时间】:2014-06-27 19:43:49
【问题描述】:
ZF2 文档以及 Matthew Weier O'Phinney 的博客中指出:
许多开发人员希望将其直接粘贴到他们的 MVC 应用程序中,
为了有漂亮的网址。但是,框架团队通常
建议不要这样做。提供 API 时,您希望响应
尽快返回,服务器基本上
在他们的设计中封装 Front Controller 和 MVC 模式,
没有充分的理由重复流程和添加流程
开销。
建议您将服务器端点放在公共目录结构中。例如,您可能有 /public/some-api.php 实例化并运行 Zend RPC 服务器。但是我已经创建了这个 dope 模块,其中我有一堆类和一个配置文件,其中列出了用于创建类的依赖注入、工厂等。
Soo...如何在我的 RPC 服务器中利用该代码,而不将其放入 MVC 控制器?
谢谢!
亚当
【问题讨论】:
标签:
zend-framework2
json-rpc
【解决方案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();
}
如您所见,我正在使用服务管理器!耶。世界上一切都很好。