symfony2:从命令访问 REST api

symfony2: accessing REST api from command

我有一个基于 symfony2 的应用程序,它基本上公开了 REST API。该应用程序没有任何 UI.

在同一个应用程序中,创建了一些命令来操作资源。如创建用户、重置用户密码、删除用户、将用户分配到特定组等

现在我希望命令 classes 使用 REST API(它们只不过是控制器操作)来执行实际操作,因为这些 REST API 已经配备了验证逻辑或需要其他业务逻辑等.

问题:从命令 classes 使用 REST API(又名控制器操作)的最佳选择是什么?我可以想到以下两种方法。

  1. 正在命令 class 中创建请求 object。设置适当的请求内容,header 等。包括控制器 class 并使用创建的请求静态调用控制器操作 object。

  2. 使用 curl 使用正确的内容和 headers 进行 http 调用。

在上述两种方法中,第一种对我来说似乎更明智,但感觉应该有更优雅的方法来实现这一点。有什么建议吗?

curl 方法允许您完全断开 api 应用程序与命令的连接。您甚至可以让开发服务器上的命令命中您的生产应用程序。这实际上是一种非常干净的方法,可以间接帮助测试您的 api。顺便说一句,如果您最终采用了 curl 方法,那么 guzzle 等第 3 方库可以让生活变得更轻松。

直接调用控制器操作可能很尴尬。正如您所指出的,您将需要伪造一个请求对象,从命令行参数填充它(假设),实例化一个控制器,调用操作并获得响应,然后解压缩响应以查看发生了什么。只是有很多 "stuff" 要做。当然,它 "couples" 您的命令代码与控制器框架代码非常紧密。

我喜欢做的是将实际的 "business" 代码移动到他们自己的服务中,然后将服务注入到控制器中。控制器动作然后变得非常薄。该操作从请求中解压缩参数,调用服务,然后将结果打包到响应中。

同样,服务也被注入到命令对象中。该命令然后解压缩它的参数,调用服务然后对结果执行任何操作。

对我来说,至少这会带来更简洁的设计。这些服务更容易测试,当然也很容易在控制器和命令之间共享功能。

当然,您的控制器操作中可能已经有一堆代码,大规模重构是不切实际的。在这种情况下,请使用假请求路由。