|
本文由Viraj Khatavkar进行同行评审。感谢所有 SitePoint 的同行评审者使 SitePoint 内容达到最佳状态! 如果您以前构建过 API,我敢打赌您已经习惯了直接转储数据作为响应。如果处理得当,它可能不会有害,但有一些实用的替代方案可以帮助解决这个小问题。 可用的解决方案之一是Fractal。它允许我们在将模型作为响应返回之前为模型创建一个新的转换层。它非常灵活且易于集成到任何应用程序或框架中。 嵌入 PHP 的分形图像 安装 我们将使用 Laravel 5.3 应用程假设每个角色都有一个存储在单独表中的权限列表,序构建一个示例并将 Fractal 包与其集成,因此请继续使用安装程序或通过 Composer 创建一个新的 Laravel 应用程序。 然后,在该文件夹内,我们需要 Fractal 包。 创建变形金刚 我们将为每个模型创建一个变压器。
班级也是如此RoleTransformer。创建控制器 我们的控制器应该在将数据发送回用户之前对其进行转换。我们将在该类上工作,并且暂时索引操作将从数据库中查询所有用户,使用用户列表和转换器创建资源集合,然后执行实际的转换过程。 当然,一次返回所有用户是 伯利兹 WhatsApp 号码列表 没有意义的,我们应该为此实现一个分页器。 分页 Laravel 倾向于让事情变得简单。我们可以这样完成分页: $users = User::paginate(10); 但为了使这项工作与 Fractal 一起工作,我们可能需要在调用分页器之前添加一些代码来转换数据。第一步是对模型中的数据进行分页。接下来,我们像以前一样创建一个资源集合,然后在该集合上设置分页器。 请注意,它添加了额外的分页详细信息字段。您可以在文档中阅读有关分页的更多信息。 包括子资源 现在我们已经熟悉了 Fractal,是时候学习如何在用户请求时将子资源(关系)包含在响应中。
我们可以请求额外的资源包含在响应中,我们的是的,这就是创建变压器所需的全部!它只是以开发人员可以管理的方式转换数据,而不是留给 ORM 或存储库。 我们扩展该类TransformerAbstract并定义transform将通过实例调用的方法User。如下所示。我们的转换器可以自动检测所请求的内容并解析include参数。该$availableIncludes属性告诉变压器我们可能需要在响应中包含一些额外的数据。includeRole如果include查询参数请求用户角色,它将调用该方法。 行负责解析包含查询参数。如果我们请求用户列表,我们应该看到如下内容如果每个用户都有一个角色列表,我们可以将变压器更改为如下所示 当包含子资源时,我们可以使用点符号嵌套关系。我们希望列出用户及其角色和权限。我们可以这样做。include=role.permissions 有时,我们需要默认包含一些必要的关系,例如地址关系。
|
|