如何使用Laravel

时间:2017-03-27 14:42:19

标签: laravel api structure code-structure

我有一些关于正确组织API应用程序的相关基本问题。虽然这是一个普遍的问题,但我可能会对我使用Laravel感兴趣。

我的结构如下:

  • 具有指向Controller类中不同方法的端点的rest api。传递的对象是Request。
  • 类型
  • 控制器类执行所有输入验证(通过验证方法),授权(通过Gates)并从数据库中获取相应的模型(基于请求中的id)。如果模型不存在,则返回错误。最后,控制器调用我的Service类中的相应方法,传递模型对象。
  • 服务类现在对模型实例执行不同的操作(例如更新用户名),保持更新(使用Eloquent)并最终将更新的模型实例返回给控制器。
  • 控制器将返回的对象“包装”为json响应并将其返回给客户端(我只是返回整个更新的对象,而不仅仅是返回成功或id)。

我的问题和疑问:

  1. 我的代码组织是否正常?
  2. 如上所述,我的控制器会抛出验证错误等。但是,如果我的服务中出现问题(即进一步向下)会怎么样?如何告诉我的控制器出现问题,以便它可以向客户端返回403(例如)JSON响应?示例:我的UserService尝试更新电子邮件地址。但是,此电子邮件已经有一个条目,因此服务需要将错误返回给控制器,控制器又向客户端返回403 json编码的错误消息。
  3. 如上所述,所有验证,授权等都在我的控制器中完成。控制器方法特别针对http请求进行,因此将Request对象作为输入并返回json。如果我想直接从我的应用程序中调用这些方法,例如从另一个控制器调用,该怎么办?如果我直接调用相应的Service类,我无法从控制器内完成的所有验证和检查中受益。但是,如果我调用控制器,它需要一个Request对象作为输入并返回一个Json http响应,这显然是我从另一个控制器调用时都不想要的。我该怎么做?
  4. 我希望我的问题足够明确!?任何帮助都非常感谢。

    谢谢, 迈克尔

1 个答案:

答案 0 :(得分:1)

我可以回答其中的几件事。

  1. 我觉得API看起来不错;只需确保将API逻辑与应用程序逻辑分开。我这样做的方法是通过路由;以/api/{version}/...为例。

  2. 使用try { ... } catch { ... }块来处理无法预料的错误(如SQL异常等),并在这些情况下返回response()->json([...], 403);

  3. 使用guzzle/http(要求将其包含在composer.json并运行composer installcomposer update)包中,以便从应用程序中的路由/控制器发送请求。您只需访问从GETPOST/api/...路由的应用的路线;它会将其识别为Request,并具有处理返回的JSON响应的功能。有关示例,请参阅http://docs.guzzlephp.org/en/latest/

  4. 虽然这是一个开放式的问题;最好尝试构建API并解决出现的特定问题。