Отправить файл с помощью 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