我有一个基于symfony2的应用程序,基本上暴露了REST API。该应用程序没有任何UI。
在同一个应用程序中,有一些命令可以用来操作资源。与创建用户一样,重新设置用户密码,删除用户,将用户分配给特定组等。
现在我希望命令类使用REST API(它们只是控制器操作)来执行实际操作,因为这些REST API已经配备了验证逻辑或需要其他业务逻辑等。
问题:使用Command类的REST API(也就是控制器操作)的最佳选择是什么?我可以想到以下两种方法。
在命令类中创建Request对象。设置正确的请求内容,标题等。包括控制器类并使用创建的请求对象静态调用控制器操作。
使用curl通过适当的内容和标题进行http调用。
在上面这两种方法中,第一种方法对我来说似乎更为理智,但感觉应该有更优雅的方式来实现这一目标。有什么建议吗?
答案 0 :(得分:1)
curl方法允许您完全断开api应用程序与命令的连接。您甚至可以让您的开发服务器上的命令命中您的生产应用程序。它实际上是一个非常干净的方法,间接有助于测试你的api。顺便说一句,如果你最终采用卷曲方法,那么像guzzle这样的第三方库可以让生活更轻松。
直接调用控制器操作可能很麻烦。正如您所指出的,您需要伪造一个请求对象,从命令行参数填充它(假设),实例化控制器,调用操作并获得响应,然后解压缩响应以查看发生的情况。只是要做很多“事情”。当然,它会将您的命令代码与控制器框架代码“强烈地”结合在一起。
我喜欢做的是将实际的“业务”代码移动到他们自己的服务中,然后将服务注入控制器。然后控制器动作变得非常薄。该操作从请求中解压缩参数,调用服务,然后将结果打包到响应中。
同样,服务也会注入命令对象。然后该命令解包它的参数,调用服务然后对结果做任何事情。
至少对我而言,这会带来更清洁的设计。这些服务更容易测试,当然很容易在控制器和命令之间共享功能。
当然,您的控制器操作中可能已经有一堆代码,而大规模重构是不切实际的。在这种情况下,请使用虚假请求路由。