работает над некоторым проектом Symfony, и я просто сообщение об ошибке - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь отправить письмо в Symfony 4 с помощью Swiftmailer, но я получаю эту ошибку всякий раз, когда пытаюсь отправить письмо:

"Невозможно автоматически передать аргумент $ извещение о« App \ Controller \ FoundController »:: show () ": он ссылается на класс" App \ Entity \ ContactNotification ", но такой службы не существует."

Вот мой FoundController:

    /**
     * @Route("/found/{id}", name="found_view", methods={"GET","POST"})
     * @param Found $found
     * @param Request $request
     * @param ContactNotification $notification
     * @return Response
     */
    public function show(Found $found, Request $request, ContactNotification $notification): Response
    {   
        $contact = new Contact();
        $contact->setFound($found);
        $form = $this->createForm(ContactType::class, $contact);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $notification->notify($contact, $found);
            $this->addFlash('message', 'Mail sent successfully!');

            return $this->redirectToRoute('found_view', [
                'id' => $found->getId()
            ]);   
        }
        return $this->render('found/view.html.twig', [
            'found' => $found,
            'form' => $form->createView()
        ]);
    }

иContactNotification.php

namespace App\Entity;

use App\Entity\Contact;
use App\Entity\Found;
use App\Entity\Lost;
use Twig\Environment;

class ContactNotification{
    /**
     * @var \Swift_Mailer
     */
    private $mailer;

    /**
     * @var Environment
     */
    private $renderer;

    public function __construct(\Swift_Mailer $mailer, Environment $renderer)
    {

        $this->mailer = $mailer;
        $this->renderer = $renderer;
    }

    public function notify(Contact $contact,Found $found){
        $message = (new \Swift_Message('Objet:', $contact->getFound()->getName()))
             ->setFrom($contact->getEmail())
             ->setTo($found->getUserEmail())
             ->setReplyTo($contact->getEmail())
             ->setBody($this->renderer->render('emails/contact.html.twig', [
                 'contact' =>$contact
             ]),'text/html');
        $this->mailer->send($message);
    }

1 Ответ

2 голосов
/ 03 октября 2019

Приложения Symfony используют Service Container или Dependency Injection Container (DIC) для создания экземпляров классов PHP, имеющих символ, подобный сервису, например Swiftmailer, EntityManager или сервисы, которые вы пишете сами. Сущность не считается услугой, ее часто называют моделью. Как таковой он не управляется контейнером. Вместо этого они управляются через EntityManager Doctrine, который может либо находить (и обновлять, либо удалять) существующие модели, либо вы создаете новую модель на месте и сохраняете ее (используя операции сохранения и сброса). Поскольку ваш ContactNotification находится внутри пространства имен для сущностей App\Entity\ Служба автоматического подключения службы Symfony будет предполагать, что это объект, управляемый Doctrine, а не служба.

Решением вашей проблемы будет перемещениеContactNotification в другую папку и пространство имен, например, src/Notifications и, таким образом, namespace App\Notifications. Это должно позволить службе автоматически подключаться и затем распознаваться внутри контроллера.

Вы всегда можете проверить правильность автоматического подключения службы с помощью команд отладки:

php bin/console debug:container ContactNotification

или

php bin/console debug:autowiring
...