Symfony服务-->;正确用法?

Symfony服务-->;正确用法?,symfony,service,controller,Symfony,Service,Controller,首先,我第一次尝试使用服务。。。(实际上,如果s.o.能提供一个关于如何、何时以及为什么使用它的简短信息..很好;-)) 但现在谈谈我的具体情况: 我写了两个控制器: 一个用于将xlsx文件上载到服务器 一个用于将xlsx数据导入数据库 我现在要做的是将(上传的)路径从上传控制器传递到导入控制器。将导入作为服务使用是否正确 代码如下所示 class FileUploadController extends Controller /** * @Route("/upload", name="upl

首先,我第一次尝试使用服务。。。(实际上,如果s.o.能提供一个关于如何、何时以及为什么使用它的简短信息..很好;-))

但现在谈谈我的具体情况:

我写了两个控制器: 一个用于将xlsx文件上载到服务器 一个用于将xlsx数据导入数据库

我现在要做的是将(上传的)路径从上传控制器传递到导入控制器。将导入作为服务使用是否正确

代码如下所示

class FileUploadController extends Controller

/**
* @Route("/upload", name="upload")
* @Security("has_role('ROLE_ADMIN')")
*/

public function uploadAction(Request $request){
    $companyid    = $this->getUser()->getCompany();

    if ($request->getMethod() == 'POST'){
        $file = $request->files->get('xls');
        $uploadedURL = '';
        if(($file instanceof UploadedFile) && $file->getError()=='0'){
            if(!($file->getSize()<20000)){
                $originalName = $file->getClientOriginalName();
                $name_array = explode('.',$originalName );
                $file_type = $name_array[(sizeof($name_array)-1)];
                $valid_filetypes = array('xls', 'xlsx');
                if(in_array(strtolower($file_type), $valid_filetypes)){

                    $document = new Document();
                    $document->setFile($file);
                    $document->setSubDirectory('uploads');
                    $document->processFile();
                    $uploadedURL=$uploadedURL=$document->getUploadDirectory().DIRECTORY_SEPARATOR.$document->getSubDirectory().DIRECTORY_SEPARATOR.$file->getBasename();



                }else{
                    echo "Wrong File Ending";
                }
            }else {
                echo "File to big";
            }

        }else{
            print_r('File Error');
            die;;
        }

        $this->get("dataimport.service")->importIndexAction($uploadedURL);

    }else{


        return $this->render(bla)
服务.yml

services:
dataimport.service:
    class: AppBundle\Controller\DataHandling\DataImportController
    arguments: [@service_container]

谢谢你的帮助

在Symfony中,控制器和服务最初只是一个类。控制器的公共方法用于获取输入并生成
响应
(输出)(通过注入
请求
的方式,您必须使用
请求栈中的当前请求
)。服务是DI容器之外的对象,没有任何约束

由于控制器的方法必须生成并返回响应,因此从另一个控制器调用控制器通常不是一个好主意,因为您可能不需要该响应,而只需要该方法的实现

这也是您应该将可重用代码移动到服务的原因。控制器实际上只应:

  • 从请求中提取数据
  • 呼叫一些服务
  • 使用结果呈现模板
命令也是如此。这些服务是应用程序的核心。控制器或命令之间的水平通信通常是个坏主意(当然只有一些代理或包装器)

以下是您的代码的一些想法:

  • 动作本身有太多不可读的代码。如果您通过symfony表单获得上传的文件,请阅读此

  • 如果使用表单,请不要直接访问请求。原因是,只有创建表单(和数据类)的生成器或
    类型
    类知道输入字段的名称并将其映射到数据类。您应该只使用数据类。然后,您会得到一个很好的
    UploadedFile
    对象来检查所有内容,但也会将检查移动到服务


  • 请看这个:。。。您是否在等待“是”或“否”之类的回答?谢谢您的回答。。。。我想说的是,有人告诉我这是否是使用服务的正确方式。。。。或者如果我完全错了。。因为我不认为如果我第一次使用它,一切都是正确的谢谢!这很有帮助!所以我怎么用它是不对的?。。您是否建议将这两个控制器合并到一个控制器中?使用服务的想法是正确的:)我编辑了我的帖子以获取更多想法。
    services:
    dataimport.service:
        class: AppBundle\Controller\DataHandling\DataImportController
        arguments: [@service_container]