Сущность коллекции форм Symfony 4 с типом файла create

Как создать и загрузить документ с помощью объекта, в котором поле fileType встроено в родительскую форму через collectionType. Я прочитал документацию Symfony Загрузить. Но этого сделать не удалось. Всегда получайте эту ошибку «Ошибка типа: аргумент 1, переданный в App \ Service \ FileUploader :: upload (), должен быть экземпляром Symfony \ Component \ HttpFoundation \ File \ UploadedFile, заданным экземпляром App \ Entity \ Attachment».

Ниже мой Счет-фактура

class Invoice
{
    /**
    * @ORM\Id()
    * @ORM\GeneratedValue()
    * @ORM\Column(type = "integer")
    */
    private $id;

    /**
    * @ORM\OneToMany(targetEntity = "App\Entity\Attachment", mappedBy = "invoiceId", cascade = {"persist"})
    */
    private $attachments;


    public function __construct()
    {
        $this->attachments = new ArrayCollection();
    }

    /**
     * @return Collection|Attachment[]
     */
    public function getAttachments(): Collection
    {
        return $this->attachments;
    }

    public function addAttachment(Attachment $attachment): self
    {
        if (!$this->attachments->contains($attachment)) {
            $this->attachments[] = $attachment;
            $attachment->setInvoiceId($this);
        }

        return $this;
    }

Вложение

class Attachment
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type = "integer")
     */
    private $id;

    /**
     * @ORM\Column(type = "string", length=255)
     */
    private $path;

    /**
     * @ORM\ManyToOne(targetEntity = "App\Entity\Invoice", inversedBy = "attachments")
     */
    private $invoiceId;

    public function getId()
    {
        return $this->id;
    }

    public function getPath(): ?string
    {
        return $this->path;
    }

    public function setPath(string $path): self
    {
        $this->path = $path;

        return $this;
    }


    public function getInvoiceId(): ?Invoice
    {
        return $this->invoiceId;
    }

    public function setInvoiceId(?Invoice $invoiceId): self
    {
        $this->invoiceId = $invoiceId;

        return $this;
    }

Тип формы вложения

namespace App\Form;

use App\Entity\Attachment;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\FileType;

class AttachmentType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('path',FileType::class, array(
            'label' => false,
        ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Attachment::class,
        ]);
    }
}

Тип формы счета

namespace App\Form;

use App\Entity\Invoice;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class InvoiceType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('attachments', CollectionType::class, array(
                'entry_type' => AttachmentType::class,
                'entry_options' => array('label' => false),
                'allow_add' => true
            ))
            ->add('submit', SubmitType::class, array(
                'label' => $options['set_button_label']
            ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Invoice::class,
            'set_button_label' => "Create Invoice",
        ]);
    }
}

и Контроллер

namespace App\Controller;

use App\Entity\Invoice;
use App\Form\InvoiceType;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Debug\Debug;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\User\UserInterface;
use App\Service\FileUploader;
use Symfony\Component\HttpFoundation\File\UploadedFile;


class InvoiceController extends Controller
{
    /**
     * @Route("/invoice/create", name = "createInvoice")
     * @param Request $request
     * @param UserInterface $user
     * @param FileUploader $fileUploader
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
     */
    public function createInvoice( Request $request, UserInterface $user, FileUploader $fileUploader)
    {
        Debug::enable();
        $invoice = new Invoice();

        $form = $this->createForm(InvoiceType::class,$invoice);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid())
        {
//            Prepare upload file
            /** @var UploadedFile $files */
            $files = $invoice->getAttachments();
            foreach($files as $file){
                $fileName = $fileUploader->upload($file);
            }
            $file->move(
                $this->getParameter('attachment_directory'),
                $fileName
            );

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($invoice);
            $entityManager->flush();

            return $this->redirectToRoute('user');
        }
        return $this->render('invoice/createInvoice.html.twig', [
            'controller_name' => 'UserController',
            'form' => $form->createView()
        ]);
    }

Я думаю, что проблема в том, что поле FileType возвращает экземпляр объекта вложения, в то время как он должен возвращать экземпляр File. вопрос в том, как мне получить значение как экземпляр файла?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
2 772
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем случае свойство $path типа UploadedFile и not $invoice->getAttachments(). Попробуйте добавить свойство в свой класс Attachement с именем $file без сопоставления доктрины, сгенерируйте его методы получения и установки.

/**
 * @var UploadedFile
 */
protected $file;

В вашем классе AttachmentType измените 'path' => 'file'. Теперь попробуйте обновить эту часть в вашем контроллере:

    $attachements = $invoice->getAttachments();
    foreach($attachements as $attachement){
        /** @var UploadedFile $file */
        $file = $attachement->getFile(); // This is the file
        $attachement->setPath($this->fileUploader->upload($file));
    }

Пожалуйста, сделайте ваш FileUploader уникальным сервисом, отвечающим за загрузку файла, нет необходимости использовать $file->move().

Спасибо, что решила мою проблему! Кстати, $ this-fileUploader-> upload ($ file) в моем случае не работал. поэтому я меняю его на $ fileUploader-> upload ($ file).

Defrian Afdi 09.05.2018 05:36

Другие вопросы по теме