Отправить файл с помощью Swift Mailer в Symfony 4

    <?php

namespace App\Controller;

use App\Entity\Candidates;
use App\Entity\Vacancy;
use App\Form\CandidatesType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class VacancyIdController extends AbstractController
{
    /**
     * @Route("/vacancy/id={id}", name="vacancy_id")
     */
    public function index($id, Request $request, \Swift_Mailer $mailer, \Swift_Attachment $attachment)
    {
        $repository = $this->getDoctrine()->getRepository(Vacancy::class);
        $vacancy = $repository->find($id);

        $candidatesResponse = new Candidates();
        $form = $this->createForm(CandidatesType::class, $candidatesResponse);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $candidatesRespouse = $form->getData();

            /** @var UploadedFile $imagereFile */
            $imageFile = $form->get('cvFileName')->getData();

            if ($imageFile) {
                $originalFilename = pathinfo($imageFile->getClientOriginalName(), PATHINFO_FILENAME);

                $safeFilename = transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()', $originalFilename);
                $newFilename = $safeFilename . '-' . uniqid() . '.' . $imageFile->guessExtension();

                try {
                    $imageFile->move(
                        $this->getParameter('image_directory'),
                        $newFilename
                    );
                } catch (FileException $e) {
                    die();
                }

                $candidatesRespouse->setCvFileName($newFilename);
            }
             $entityManager = $this->getDoctrine()->getManager();
             $entityManager->persist($candidatesResponse);
             $entityManager->flush();

            $attachment = new \Swift_Attachment::fromPath("/home/vasjeni/Документи/juliSymfony/public/uploads/images/$newFilename");

            $message = (new \Swift_Message('Новый отклик на вакансию'))
                ->setFrom('*@gmail.com') //почта намерено изменена
                ->setTo('*@gmail.com') //почта намерено изменена
                ->setBody(
                    $this->renderView(
                        'emails/emailCandidates.html.twig',
                        ['candidate' => $candidatesResponse, 'vacancy' => $vacancy->getTitle()]
                    ),
                    'text/html')
                ->attach($attachment);

            $mailer->send($message);

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


        return $this->render('vacancy_id/index.html.twig', [
            'id' => $id,
            'vacancy' => $vacancy,
            'form' => $form->createView(),
        ]);
    }
}

но выбивает ошибку

Expected to find class "App\Controller\VacancyIdController" in file "/home/vasjeni/Документи/juliSymfony/src/Controller/VacancyIdController.php" while importing services from resource "../src/*", but it was not found! Check the namespace prefix used with the resource in /home/vasjeni/Документи/juliSymfony/config/services.yaml (which is loaded in resource "/home/vasjeni/Документи/juliSymfony/config/services.yaml").

удаляю атачи с контролера

public function index($id, Request $request, \Swift_Mailer $mailer)

и делаю так

$attachment = (new \Swift_Attachment())
            ->setFilename($candidatesRespouse->getCvFileName())
            ->setBody($imageFile);

получаю файл с контентом

/tmp/php4UXOQY

потому что данные не правильные

помогите пожалуйста решить проблему Хочу чтоб файл помимо того чтоб сейвился в папку еще его добавить в атачи письма и отправить по почте


Ответы (1 шт):

Автор решения: Dmitry Kozlov

получаю файл с контентом

Все правильно, поскольку $imageFile содержит строку с путем временного файла, вот и аттачит текстовый файл

Ошибка с сервисом

... (..., \Swift_Attachment $attachment)

нет такого сервиса в swiftmailer-bundle, поэтому ошибка с запуском контроллера

Вот здесь еще ошибка, зачем делать new, если вызывается статический метод?

$attachment = new \Swift_Attachment::fromPath

исправьте на

$attachment = \Swift_Attachment::fromPath
→ Ссылка