在Symfony4中保存文件不会执行任何操作

时间:2019-01-04 00:22:53

标签: php symfony symfony4

我有一个页面,用户可以在其中上传图片。这些图片将在打开此页面后全部加载,如果提交了表单,它将保存图片文件并与其他文件一起加载。

本周要浏览数十次Symfony官方文档,我无法弄清楚为什么我的function homeView()什么也不做。

我真正想要的是将此文件保存在/public/pictures目录中,但不会发生。

该网站正在刷新,没有任何错误消息或其他任何信息。我在做错什么吗?

HomeController 文件:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Response;
use App\Service\PicturesService;
use App\Entity\Picture;
use Symfony\Component\HttpFoundation\File\UploadedFile;

class HomeController extends AbstractController
{
    public function homeView()
    {
        $pictures = $this->getDoctrine()
            ->getRepository(Picture::class)
            ->findAll();

        $form = $this->createFormBuilder()
            ->add('file', FileType::class)
            ->add('save', SubmitType::class)
            ->getForm();

        if ($form->isSubmitted() && $form->isValid()) {

            $formData = $form->getData();

            try {
                $formData->file->move(
                    $this->getParameter('pictures_directory'),
                    'file_name');
            }

            catch (FileException $e) {
                return new Response($e);
            }

            /*
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($db_file_url);
            $entityManager->flush();
            */
        }

        return $this->render('home.html.twig', array(
            'form' => $form->createView(),
            'pictures' => $pictures));
    }
}

services.yaml 文件:

parameters:
    locale: 'en'
    pictures_directory: '%kernel.project_dir%/public/pictures'
services:
    _defaults:
        autowire: true      
        autoconfigure: true
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

树枝视图表单:

{{ form(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

1 个答案:

答案 0 :(得分:1)

首先,由于未提交表单,您的代码将永远无法到达控制器中第一个if语句的内部代码。在表单实例化下面添加以下行:

$form->handleRequest($request);

要使表单处理正常工作,您需要在Symfony\Component\HttpFoundation\Request方法中键入提示homeView()对象作为参数:

public function homeView(Symfony\Component\HttpFoundation\Request $request)

现在正在提交表单,您将遇到以下错误:

  

注意:试图获取非对象的属性“文件”

发生该错误是因为getData()对象的$form方法返回一个数组,而不是一个对象。您需要访问此数组的file元素,并在其上调用move()方法:

$formData = $form->getData();

/** @var UploadedFile $file */
$file = $formData['file'];
$file->move('var/files', 'file_name');