Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我的控制器应如何与Symfony2中的服务通信?_Php_Symfony_Model View Controller - Fatal编程技术网

Php 我的控制器应如何与Symfony2中的服务通信?

Php 我的控制器应如何与Symfony2中的服务通信?,php,symfony,model-view-controller,Php,Symfony,Model View Controller,我正试图使我的控制器精简,完美的一次服务呼叫。所以我写下我的行动: public function actionDoSomething($request, $arg1, $arg2) { $result = $someService->doSomething($arg1, $arg2); if ($result === true) return 'Done'; return 'Failed, but cannot say why'; } 现在我

我正试图使我的控制器精简,完美的一次服务呼叫。所以我写下我的行动:

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

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

    return 'Failed, but cannot say why';
}
现在我有我的疑问:

  • 用户输入直接传递到服务是否可以, 没有任何消毒/过滤/验证?可能并不总是需要调用它(例如,
    $arg1
    应为整数,但用户输入1.25)

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

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

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

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

    您不应该做的是通过服务方法返回的值来检查服务方法或任何其他方法的操作是否成功,PHP例外情况就是这样。也就是说,假设一切顺利,除非抛出异常


  • 这就是为什么可以在将数据传递给服务之前运行验证。但是,如果无效数据到达服务,这是一个例外。因此,我必须验证相同的数据两次?嗯,这取决于实际情况。有时,仅仅从服务层捕获异常就足够了,但有时,出于某种原因,您可能希望在将异常传递给服务层之前对其进行验证。这取决于你。顺便说一句,您至少要验证数据两次-至少您应该这样-一次在应用程序中,一次在数据库中。问题是我的控制器不能负责输入验证,但需要知道操作失败的原因(为用户显示消息),但另一方面,服务层根本不应该了解UI人员,为什么不能呢?嗯,控制器本身并不负责验证——它只是将其委托给验证设施——例如,通过使用
    验证器
    服务——并根据所使用的UI格式化返回的约束冲突列表。这个问题似乎与主题无关,因为它属于