我正在使用服务层,直到现在我使用的是ServiceObject(实现了ArrayAccess,Iterator,Countable),但我想知道这是不是一个好主意。
你会这样做:
ArticleService::createArticle($articleData, $userId);
或
ArticleService::createArticle(ServiceObject $data);
其中$data
是:
array(
'title' => 'Lorem ipsum',
'body' => 'Dolor sid amet',
'userId' => 55,
);
ServiceObject的好处是为每个方法提供一个通用的签名,但有时它看起来不高效,并且它没有被广泛使用,它失去了它的兴趣。
有任何反馈吗?
答案 0 :(得分:5)
将其更改为:
ArticleService::createArticle($title, $body, $user_id);
这清楚地说明了创建“文章”所需的内容。
像你的$articleData
和$data
那样的'p''选项'数组不可能明智地理解,我会反对它。
将您的想法归结为通用ServiceObject
,这实际上是一个非常糟糕的主意。你的动机是高尚的,但这是错误的解决方案。
如果你需要更有说服力,请随意戳。
答案 1 :(得分:2)
我认为这里最好的方法是拥有像
这样的东西$article = new Article;
$article->title = "Lorem ipsum"
$article->body = "Dolor sit amet"
$article->creator = $userID
ArticleService::createArticle($article)
虽然可能“createArticle”不再是该功能的最佳名称,但是已经创建了Article对象。你可能会有类似ArticleService::publishArticle($article)
的东西,虽然我不知道你在做什么。
您想要的是将数据的构造(Article
)与其使用(ArticleService
)分开。
我真正想说的是不要使createArticle的参数成为通用数组或“ServiceObject”,这两者都是参数列表的无用抽象,使它成为真正代表相关实体的类。 / p>
答案 2 :(得分:0)
我投票支持该对象,因为复杂系统中的代码完成是非常好的事情,也是一些自动验证,因为当您知道对象类型时,您可以以某种方式验证它。但是如果你在createSomething中没有复杂的逻辑,那么数组也可以适合。
答案 3 :(得分:0)
第二种方式更好,你永远不会遇到人们以错误的方式调用你方法的问题!它也更容易阅读和查看所需内容。对于我作为开发人员,很明显我必须传递类型为ServiceObject
的对象,然后我开始搜索文档或此类的示例或接口。但在第一个例子中,我必须阅读createArticle
的代码,以确定如何处理这两个参数。
第二种方法还可以帮助您保持API /签名的清洁。如果在createArticle
中需要一些其他数据,您只需通过ServiceObject
传递它们,而无需更改签名!
第一个例子的更好的签名是:
ArticleService::createArticle(array $articleData, $userId);
在这种情况下,$articleData
必须是一个数组。这可以防止错误。在PHP函数参数中,只能使用数组和类名进行强制转换。
答案 4 :(得分:0)
没有正确的方式,但在这种特定情况下我会使用ArticleService::createArticle($articleData, $userId);
。
我认为该文章具有必需的非空属性userId(您从上下文中获取)和可选(不是非常重要)的内容数据,这些数据可能为空。
这样,文章和用户对象之间的连接是显而易见的。可读性略有提高。否则,您需要完全熟悉所需的数据和createArticle方法。
作为证据:当我看到ArticleService::createArticle($articleData, $userId)
时,我立刻明白了方法正在做什么以及对输入数据的期望是什么,而第二个让我困惑。
此外,如果缺少userId,此时您将收到错误,而不是在您将其插入数据库时,您可能会收到更难跟踪的SQL错误。
另一方面,在ZF中,使用数组作为参数是很常见的,因此您的代码可能会以不同的样式显示。
然而,这主要取决于您的偏好。
答案 5 :(得分:0)
我认为更好的方法是注入一个对象。但为什么ServiceObject存在呢? 你有一个方法createArticle,那么将一个文章对象传递给它是合乎逻辑的,不是吗? 以这种方式组织验证过程更简单,您可以只标记要在注释中验证的字段。
这也是你正在使用的方法问题。如果在服务层中使用数据映射器模式,那么显然应该将对象传递给它。
使用对象,您可以在对象之间建立透明且清晰的通信界面。 使用数组时,不清楚您传输的数据类型,字段类型等等。