【问题标题】:Is it better to put auxiliary helper functions in the controller or in a service that interacts with a Domain Object?将辅助辅助函数放在控制器中还是放在与域对象交互的服务中更好?
【发布时间】:2014-07-17 17:42:12
【问题描述】:

我正在创建一个 Web 应用程序,用户可以在其中提交不同类型的内容。目前,处理内容并保存它是由 ContentService 之类的东西完成的,它进一步将任务委托给 ContentMapper(对于 DataMapper 模式)等。

随着应用程序的增长,提交ContentObject 需要涉及其他任务。例如,需要调用PermissionService(确定允许哪些用户查看内容)和NotificationService(确定如何通知用户新内容)。

我应该将这些辅助服务(权限/通知)调用放在控制器还是服务中,以实现创建结构化代码的目标?

也就是说,我要这样做吗:

ContentService->createNewContent()
// in ContentService
public function createNewContent($contentObject) {
    // Database calls and other stuff, validation..
    PermissionService->determinePermissionsForContent($contentObject)
    NotificationService->notifyUsers($contentObject)
}

还是我将这些东西(因为它们更加独立并且我试图遵守 SRP)放入控制器中?

// in ContentController
$contentObject = // something creates the contentObject from user-data
ContentService->saveNewContent($contentObject)
PermissionService->determinePermissionsForContent($contentObject)
NotificationService->notifyUsers($contentObject)

我主要感到困惑,因为辅助服务基本上仅在保存内容时运行,并且它们可能需要某些数据(即数据库 ID),这就是我在 ContentService 中考虑它们的原因。 另一方面,如果我将它们放在控制器中,这似乎更符合 SRP,因为 ContentService 并没有做太多事情。

哪个是首选?

【问题讨论】:

    标签: php oop object design-patterns model-view-controller


    【解决方案1】:

    第二种方法绝对不会使其更符合 SRP,因为您需要这些东西来创建您的 contentObject(您试图掩饰)。

    注意:我并不完全赞同拥有PermissionService 的概念,因为权限是内容“元数据”的一部分。

    我的方法应该是从控制器调用两个服务:

    public function postContent($request)
    {
        $contentParams = [
            'title' => $request->getParam('foo'),
            'text' => $request->getParam('bar'),
        ];
        $library->addEntry($contentParams);
        $notifier->sendUpdates();
    }
    

    .. 第一个调用创建新内容,第二个调用检查最新添加并发送通知。并且将 $contentObject 拖到任何地方是没有意义的,因为它们都应该与共享存储库进行交互。

    底线是这样的:您的第二种方法更好,但悬空的内容对象没有意义。在我看来,您似乎还没有弄清楚如何让您的服务共享域对象。

    【讨论】:

    • 共享存储库到底是什么意思?在你的 sn-p 中,sendUpdates 不带任何参数,通知程序依赖于 $contentParams 中的信息。通知者如何知道提交的内容?
    • 否,通知程序取决于是否创建了任何新条目。如果通知程序和库与同一个repository 交互,那么通知程序只会关心是否有新添加的内容。
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2012-11-16
    • 2013-01-17
    相关资源
    最近更新 更多