我正在努力决定这个困境,因为我正在编写一些正在研究的PHP API。我正在努力编写一些可靠的API,而不是PHP的老手,通过黑暗的希望找到一些最佳实践。我也不确定我是否使用了正确的术语,所以请纠正我。
我有一些实体将他们的数据存储在数据库中,我正在以面向对象的方式进行建模。我的模型是否应始终严格代表数据库中当前的内容?
<?php
// Write a snippet
$snippet = (new Snippet)
->label("grapes")
->content("wine")
->save();
// Load a snippet
$snippet = (new Snippet)
->label("bananas")
->load();
// Update an existing snippet
$snippet
->content("potassium")
->save();
?>
<?php
// Write a snippet
$snippet = (new Snippet)->write("grapes", "wine");
// Load a snippet
$snippet = (new Snippet)->read("bananas");
// Update an existing snippet
$snippet->update("potassium");
?>
您更喜欢使用哪种API样式?
我从松散的模型开始,并开始怀疑严格的模型是否是更好的做事方式? 严格模型的完整性承诺是否超过松散模型的灵活性?
我对任何想法,评论,优点/缺点,替代方案和想法持开放态度;我只是想做正确的PHP,并制作一个其他程序员觉得讨人喜欢的好API:)
答案 0 :(得分:1)
这两个例子都让我想起了ActiveRecord模式。 ActiveRecord是指您使用CRUD方法赋予对象时 - 也就是说,他们知道如何从数据源创建,读取,更新和删除自己。
现在,如果我正确理解你,你想知道是否能够设置模型的属性,然后然后调用CRUD方法,或者调用直接使用CRUD方法,传入在内部设置属性的参数?在任何一种情况下,它似乎都是“表示”和“#39;与另一方一样宽松或严格。就一个好的API来说,我会说'松散'&#39;代表性将是大多数人所期望的。
现在,提出建议。有两种流行的模式可以与数据源进行交互。一个是ActiveRecord模式,另一个是存储库模式。我简要描述了ActiveRecord模式。存储库模式从模型中删除数据交互职责,并将其放入“存储库”中。类。此存储库类负责CRUD操作。关于ActiveRecord诉存储库模式的优缺点有很多帖子,所以你可以看一下。我会说,存储库模式被更广泛地接受为“更好”的模式。一。
参考你说的时候,&#34;用户可以自由地改变模型的属性,然后保存对数据库的任何改变。&#34;一般来说,对象应该保护它们的不变量。也就是说,您不应该允许将其数据设置为无效状态。一个对象应该构造以及它需要的信息,并且除非有意义改变对象中的值,否则不提供setter。即便如此,你通常可以给setter一个更好的名字,然后就是setX()。 ei:fillUp()而不是car对象上的setFuel()。
我个人会用存储库模式设计东西:
class SnippetRepository
void save(Snippet snippet) { ... }
void update(Snippet snippet) { ... }
boolean delete(Snippet snippet) { ... }
Snippet load(SnippetId id) { ... }
end
$snippet = (new Snippet)
->label("grapes")
->content("wine");
snippetRepository.save($snippet);
我希望有所帮助。