【问题标题】:How should my controllers communicate with my services in Symfony2?我的控制器应该如何与 Symfony2 中的服务通信?
【发布时间】:2013-09-10 15:26:11
【问题描述】:

我正在努力使我的控制器变薄,完美地完成一次服务调用。所以我写下我的行动:

public function actionDoSomething($request, $arg1, $arg2)
{
    $result = $someService->doSomething($arg1, $arg2);

    if ($result === true)
        return 'Done';

    return 'Failed, but cannot say why';
}

现在我有疑问了:

  1. 用户输入直接传递给服务可以吗, 没有任何消毒/过滤/验证?也许并不总是需要调用它(例如,$arg1 应该是整数,但用户输入的是 1.25)?

  2. 服务可能会做很多控制器不知道的工作。应该从服务返回什么类型?布尔值,整数,SomeResult 类,数组,混合?失败时应该返回什么数据?常量值,消息数组?我需要它来响应。我可以采用任何标准或最佳实践吗?

【问题讨论】:

标签: php symfony model-view-controller


【解决方案1】:
  1. 您传递给服务层的数据格式应该由服务层本身驱动。您可以拥有多种 UI——HTML、REST、命令行——每一种都以不同的方式与用户交换数据。所有这些类型的控制器都必须解析用户数据并以它理解的格式将其传递给服务层,反之亦然——从服务层获取数据并根据 UI 的类型对其进行格式化。

    最终验证可以在服务层完成,以确保无效数据不会通过它,但如果这有助于您以更友好的方式向用户报告验证错误,您仍然可以从控制器调用验证服务.

  2. 服务层返回的数据类型取决于您调用的方法应该做什么。例如,数据保存方法可能不返回任何内容,而数据获取实体将以您需要或喜欢的格式返回数据。

    你应该做的是通过它返回的值来检查服务方法或任何其他方法的操作是否成功 - PHP 异常就是为此。也就是说,假设一切顺利,除非抛出异常。

【讨论】:

  • 这就是您可以在将数据传递给服务之前运行验证的原因。但是如果无效数据到达服务,它是一个例外。
  • 所以我必须两次验证相同的数据?
  • 嗯,这真的取决于。有时仅从服务层捕获异常就足够了,但有时您可能希望在将内容传递给服务层之前进行验证,因为某些原因。由你决定。顺便说一句,无论如何,你至少要验证数据两次——至少你应该——一次在应用程序中,一次在数据库中。
  • 重点是我的控制器不能负责输入验证,但需要知道为什么操作失败(向用户显示消息),但另一方面服务层不应该知道UI 工作人员。
  • 为什么不能呢?好吧,控制器本身不负责验证——它只是将它委托给验证设施——例如,通过使用validator 服务——并根据正在使用的 UI 格式化返回的约束违规列表。
猜你喜欢
  • 2012-01-22
  • 2013-10-05
  • 2020-08-17
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
相关资源
最近更新 更多