【问题标题】:symfony2: accessing REST api from commandsymfony2:从命令访问 REST api
【发布时间】:2015-11-16 16:28:29
【问题描述】:

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

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

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

问题:从 Command 类中使用 REST API(也称为控制器操作)的最佳选择是什么?我可以想到以下两种方法。

  1. 在命令类中创建请求对象。设置适当的请求内容、标头等。包括控制器类并使用创建的请求对象静态调用控制器操作。

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

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

【问题讨论】:

    标签: php rest symfony curl command-line-interface


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 感谢使用服务模块的想法。我基本上是为了学习目的而做的,所以我绝对可以将它重构到我需要的任何程度。我会带着我的发现回来。
    猜你喜欢
    • 2017-06-03
    • 2013-05-07
    • 2017-02-09
    • 2017-01-21
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2012-10-27
    • 2020-06-14
    相关资源
    最近更新 更多