Сохранение файла в Symfony4 ничего не делает - PullRequest
0 голосов
/ 04 января 2019

У меня есть страница, где пользователи будут загружать картинки.Все эти картинки будут загружены после открытия этой страницы, если форма будет отправлена, она сохранит файл рисунка и загрузит его вместе с остальными.

Проходя через официальную документацию 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 голосов
/ 04 января 2019

Во-первых, ваш код никогда не достигнет внутреннего кода первого оператора if в вашем контроллере, поскольку форма не отправлена.Добавьте следующую строку ниже создания формы:

$form->handleRequest($request);

Чтобы обработка формы работала, вам нужно ввести подсказку объекта Symfony\Component\HttpFoundation\Request в качестве аргумента в методе homeView():

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

Теперь, когда ваша форма отправляется, вы столкнетесь со следующей ошибкой:

Примечание: попытка получить свойство 'file' необъекта

Эта ошибкапроисходит потому, что метод getData() вашего объекта $form возвращает массив, а не объект.Вам нужно получить доступ к элементу file этого массива и вызвать метод move() для этого:

$formData = $form->getData();

/** @var UploadedFile $file */
$file = $formData['file'];
$file->move('var/files', 'file_name');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...