与PHP中的toArray()相比,使用分形有什么优势

与PHP中的toArray()相比,使用分形有什么优势,php,api,oop,Php,Api,Oop,我偶然发现了PHP联盟,它表明其目的是确保存储和输出(客户端)之间的输出格式 我使用API已经一年多了,我已经为我希望返回的大多数实体构造了toArray()函数。借助于Eloquent,如果已将实体模型附加到Eloquent模型,则可以重载toArray()函数并从中进行修饰 例如: public function toArray() { $array = parent::toArray(); $array['extra'] = true; ... return

我偶然发现了PHP联盟,它表明其目的是确保存储和输出(客户端)之间的输出格式

我使用API已经一年多了,我已经为我希望返回的大多数实体构造了toArray()函数。借助于Eloquent,如果已将实体模型附加到Eloquent模型,则可以重载toArray()函数并从中进行修饰

例如:

public function toArray()
{
    $array = parent::toArray();
    $array['extra'] = true;
    ...
    return $array;
}

如果API应该是快速和轻量级的,那么PHP League的Fractal与实现toArray()或存储库/管理器中的format($data)函数相比有什么优势?是因为OOP吗?如果是,有人能举个例子吗?

对我来说,优点是:

  • 通过将模型传递给Fractal的资源对象来实现一致的响应格式
  • 通过简单地切换serialiser(例如,从json api到hal,可能更多),可以在整个应用程序中轻松更改响应格式。对于json api,它做了一些无聊的事情,比如分割实际响应数据和根元数据。此外,您还可以根据
    Accept
    标题轻松更改响应,这对于数组来说可能更困难(您需要重新构造它,当然您不希望控制器中出现混乱)
  • 链接生成的自动化,例如分页
我认为前两个不是分形所独有的,而是对响应格式进行任何抽象的目的

我不清楚的是,像分形这样的东西属于哪里?我非常支持这样的观点,即模型应该能够表示自己,就像它在
\uuuuToString
中所做的那样。但有人可能会再次争辩说,与其说是模型,不如说是演示的问题。使用fractal的分页,嵌入支持变得更加不清晰,因为(对我来说)这有点偏离了演示本身

速度问题当然是有效的,但您可以在其他地方进行优化,例如,如果您没有基础设施,可以将整个响应内容缓存在varnish或执行类似角色的laravel包上(注意,它不适用于每个用例,授权或不同的用户特定响应就是一个例子)

关于示例,我可以推荐两个,在文件包旁边:


我很想看一些关于分形这样的东西如何适合一个更大的结构化项目的文章。

谢谢你的回答,我将研究两个推荐的链接,因为我找不到任何有意义的东西可以显示我比toArray()的优势。如果我能对这一点有所了解,我会尝试写一篇小的后续文章,看看它是否能用于更大的领域。期待着它。我已经发布了,因为我无法决定如何在基于Laravel的API中抽象响应格式。