【问题标题】:Trying to divide main controller method to two separate methods试图将主控制器方法划分为两个单独的方法
【发布时间】:2020-09-17 01:57:38
【问题描述】:

我正在尝试将控制器中的主要方法划分为两个独立的方法 - 一个用于返回生成的表单,一个用于以这种形式上传文件。但是我无法用我的想法来理解它是如何做到的......

这是我目前工作的控制器:

class UploaderController extends AbstractController
{
    private ConfigVendors $configVendors;

    public function __construct(ConfigVendors $configVendors)
    {
        $this->configVendors = $configVendors;
    }

    /**
     * @Route("/", name="upload_terms")
     *
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function formRender(Request $request, TranslatorInterface $translator)
    {
        /** @var UploadedFile $uploadedFile */
        $formUploader = new FormUploader();
        $form = $this->createForm(FormUploaderType::class, $formUploader);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $catalog = $request->request->get('form_uploader')['service'];

            $fileNameGenerator = new FileNameGenerator($request);
            $originalFileName = $fileNameGenerator->getOriginalFilename();
            $tmpPath = $fileNameGenerator->getFilePath();

            $upload = new Uploader($catalog.'/'.$originalFileName, file_get_contents($tmpPath));

            if (!$upload->gitlabUpload()) {
                $this->addFlash('danger', $translator->trans('uploadTermsError'));
            } else {
                $url = $this->configVendors->vendorUrl($catalog).'/'.$catalog.'/'.$originalFileName;
                $this->addFlash('success', $translator->trans('uploadTermsSuccess'));
                $this->addFlash('info', $url.'<br><a href="'.$url.'" target="_blank">Podgląd</a> <br><br> Plik będzie dostępny po kilku minutach, proszę o cierpliwość!');
            }

            return $this->redirectToRoute('upload_terms');
        }

        return $this->render('uploader/upload.html.twig', [
            'createForm' => $form->createView(),
        ]);
    }
}

这是我试图划分它的尝试......

/**
 * @Route("/", name="upload_terms")
 */
public function getIndexAction()
{
    /** @var UploadedFile $uploadedFile */
    $formUploader = new FormUploader();
    $form = $this->createForm(FormUploaderType::class, $formUploader);

    return $this->render('uploader/upload.html.twig', [
        'createForm' => $form->createView(),
    ]);
}

/**
 * @Route("/", name="upload_terms")
 *
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function formUpload(Request $request, TranslatorInterface $translator)
{
    /** @var UploadedFile $uploadedFile */
    $formUploader = new FormUploader();
    $form = $this->createForm(FormUploaderType::class, $formUploader);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $catalog = $request->request->get('form_uploader')['service'];

        $fileNameGenerator = new FileNameGenerator($request);
        $originalFileName = $fileNameGenerator->getOriginalFilename();
        $tmpPath = $fileNameGenerator->getFilePath();

        $upload = new Uploader($catalog.'/'.$originalFileName, file_get_contents($tmpPath));

        if (!$upload->gitlabUpload()) {
            $this->addFlash('danger', $translator->trans('uploadTermsError'));
        } else {
            $url = $this->configVendors->vendorUrl($catalog).'/'.$catalog.'/'.$originalFileName;
            $this->addFlash('success', $translator->trans('uploadTermsSuccess'));
            $this->addFlash('info', $url.'<br><a href="'.$url.'" target="_blank">Podgląd</a> <br><br> Plik będzie dostępny po kilku minutach, proszę o cierpliwość!');
        }

        return $this->redirectToRoute('upload_terms');
    }

}

【问题讨论】:

  • 你的问题是什么?这样做是不可能的,因为您无法在一个请求上触发两个操作(至少在不编写更多代码的情况下不会)。更好的解决方案可能是使用单独的服务

标签: php forms symfony methods controller


【解决方案1】:

你可以试试这个

public function formUpload(Request $request, TranslatorInterface $translator)
    {
        /** @var UploadedFile $uploadedFile */
        $formUploader = new FormUploader();
        $form = $this->createForm(FormUploaderType::class, $formUploader);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $catalog = $request->request->get('form_uploader')['service'];
            $fileNameGenerator = new FileNameGenerator($request);
            $originalFileName = $fileNameGenerator->getOriginalFilename();
            $tmpPath = $fileNameGenerator->getFilePath();
            $upload = new Uploader($catalog.'/'.$originalFileName, file_get_contents($tmpPath));
            $this->gitlabupload($upload, $translator, $catalog, $originalFileName);

            return $this->redirectToRoute('upload_terms');
        }

        return $this->render('uploader/upload.html.twig', [
            'createForm' => $form->createView(),
        ]);
    }

    private function gitlabupload($upload, $translator, $catalog, $originalFileName)
    {
        if (!$upload->gitlabUpload()) {
            $this->addFlash('danger', $translator->trans('uploadTermsError'));
        } else {
            $url = $this->configVendors->vendorUrl($catalog).'/'.$catalog.'/'.$originalFileName;
            $this->addFlash('success', $translator->trans('uploadTermsSuccess'));
            $this->addFlash('info', $url.'<br><a href="'.$url.'" target="_blank">Podgląd</a> <br><br> Plik będzie dostępny po kilku minutach, proszę o cierpliwość!');
        }
    }

【讨论】:

  • 最后一个问题,如何在注释中添加方法(“GET”)?因为现在它向我抛出了一个错误,即不允许使用此方法...
  • 按照文档symfony.com/doc/current/routing.html@Route(... methods={"GET"})
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多