如何使用 Laravel 正确组织 API-app
How to properly organize an API-app with Laravel
我有一些关于正确组织 API-app 的相关基本问题。尽管这是一个一般性问题,但我使用 Laravel.
可能会引起兴趣
我的结构如下:
- 休息 api 端点指向 Controller class 中的不同方法。传递的对象是请求类型。
- 控制器 classes 执行所有输入验证(通过验证方法)、授权(通过 Gates)并从数据库中获取相应模型(基于请求中的 id)。如果模型不存在,则会 return 出错。最后,控制器调用我的服务 classes 中的相应方法,传递模型对象。
- 服务 classes 现在对模型实例执行不同的操作(例如更新用户名),持久更新(使用 Eloquent),最后 return 更新模型实例到控制器。
- 控制器 "wraps" 将 returned 对象转换为 json 响应并 return 将其发送给客户端(我只是喜欢 return 整个更新了对象,而不仅仅是 returning 成功或 id)。
我的疑问和问题:
- 我的代码组织是否正确?
- 如前所述,验证错误等是从我的控制器中抛出的。但是,如果我的服务出现问题怎么办(即进一步向下)?我怎样才能告诉我的控制器出了点问题,以便它可以 return 403(例如)JSON 响应客户端?示例:我的 UserService 尝试更新电子邮件地址。但是,此电子邮件已经有一个条目,因此服务需要 return 将错误返回给控制器,后者又 return 将 403 json 编码的错误消息发送给客户端.
- 如前所述,所有验证、授权等都在我的控制器中完成。控制器方法是专门为 http 请求制作的,因此将 Request 对象作为输入和 return json。如果我想直接从我的应用程序中调用这些方法怎么办,例如从另一个控制器?如果我直接调用相应的服务 class,我将无法从控制器中完成的所有验证和检查中受益。但是,如果我调用控制器,它需要一个 Request 对象作为输入,并且 return 是一个 Json http 响应,显然,当我从另一个控制器调用时,我都不希望这样。我应该怎么做?
我希望我的问题足够清楚!?非常感谢任何帮助。
谢谢,
迈克尔
我可以回答其中的一些问题。
我认为 API 看起来不错;请务必将 API 逻辑与应用程序逻辑分开。我这样做的方式是通过路由; /api/{version}/...
为例。
使用 try { ... } catch { ... }
块来处理不可预见的错误(如 SQL 异常等)和 return response()->json([...], 403);
在这些情况下。
使用guzzle/http
(需要将其包含在您的composer.json
和运行一个composer install
或composer update
)包裹中发送来自 routes/controllers 在您的应用程序中的请求。您可以简单地从您的应用程序访问 GET
或 POST
到 /api/...
路由的路由;它会将其识别为 Request
并具有处理 returned JSON
响应的功能。有关示例,请参阅 http://docs.guzzlephp.org/en/latest/。
虽然这是一个开放式问题;最好尝试构建您的 API 并解决出现的具体问题。
我有一些关于正确组织 API-app 的相关基本问题。尽管这是一个一般性问题,但我使用 Laravel.
可能会引起兴趣我的结构如下:
- 休息 api 端点指向 Controller class 中的不同方法。传递的对象是请求类型。
- 控制器 classes 执行所有输入验证(通过验证方法)、授权(通过 Gates)并从数据库中获取相应模型(基于请求中的 id)。如果模型不存在,则会 return 出错。最后,控制器调用我的服务 classes 中的相应方法,传递模型对象。
- 服务 classes 现在对模型实例执行不同的操作(例如更新用户名),持久更新(使用 Eloquent),最后 return 更新模型实例到控制器。
- 控制器 "wraps" 将 returned 对象转换为 json 响应并 return 将其发送给客户端(我只是喜欢 return 整个更新了对象,而不仅仅是 returning 成功或 id)。
我的疑问和问题:
- 我的代码组织是否正确?
- 如前所述,验证错误等是从我的控制器中抛出的。但是,如果我的服务出现问题怎么办(即进一步向下)?我怎样才能告诉我的控制器出了点问题,以便它可以 return 403(例如)JSON 响应客户端?示例:我的 UserService 尝试更新电子邮件地址。但是,此电子邮件已经有一个条目,因此服务需要 return 将错误返回给控制器,后者又 return 将 403 json 编码的错误消息发送给客户端.
- 如前所述,所有验证、授权等都在我的控制器中完成。控制器方法是专门为 http 请求制作的,因此将 Request 对象作为输入和 return json。如果我想直接从我的应用程序中调用这些方法怎么办,例如从另一个控制器?如果我直接调用相应的服务 class,我将无法从控制器中完成的所有验证和检查中受益。但是,如果我调用控制器,它需要一个 Request 对象作为输入,并且 return 是一个 Json http 响应,显然,当我从另一个控制器调用时,我都不希望这样。我应该怎么做?
我希望我的问题足够清楚!?非常感谢任何帮助。
谢谢, 迈克尔
我可以回答其中的一些问题。
我认为 API 看起来不错;请务必将 API 逻辑与应用程序逻辑分开。我这样做的方式是通过路由;
/api/{version}/...
为例。使用
try { ... } catch { ... }
块来处理不可预见的错误(如 SQL 异常等)和 returnresponse()->json([...], 403);
在这些情况下。使用
guzzle/http
(需要将其包含在您的composer.json
和运行一个composer install
或composer update
)包裹中发送来自 routes/controllers 在您的应用程序中的请求。您可以简单地从您的应用程序访问GET
或POST
到/api/...
路由的路由;它会将其识别为Request
并具有处理 returnedJSON
响应的功能。有关示例,请参阅 http://docs.guzzlephp.org/en/latest/。
虽然这是一个开放式问题;最好尝试构建您的 API 并解决出现的具体问题。