@1alexandr

Symfony2. Как правильно обратиться к mailer?

Здравствуйте, уважаемые знатоки!
Подскажите мне пожалуйста, что я делаю неправильно (я нуб, не ругайтесь). Вот кусок кода:
public function showAction(Request $request)
    {
        $dataMail = [
            'name' => '',
            'subject' => '',
            'email' => '',
            'message' => '',
        ];

        $form = $this->formFactory->create('send_mail_form', $dataMail);
        
        if ($request->getMethod() == 'POST') {
            $form->bind($request);
            $dataMail = $form->getData();

            $message = \Swift_Message::newInstance()
                ->setSubject($dataMail['subject'])
                ->setFrom($dataMail['email'])
                ->setTo('mail@mail.ru')
                ->setBody($this->renderView('AllergoMainBundle:Service:body_mail.html.twig', [
                    'name' => $dataMail['name'],
                    'message' => $dataMail['message'],
                ]));
            $this->get('mailer')->send($message);
        }

        return [
            'form' => $form->createView(),
        ];
    }


Вылазит такая ошибка, как я понял из-за $this->get('mailer'):
Error: Call to a member function get() on a non-object


Мне кажется я понял как решить проблему, нужно найти наймспейс мэйлера, я не могу его найти
  • Вопрос задан
  • 2595 просмотров
Пригласить эксперта
Ответы на вопрос 4
@shoomyst
dumb
Всё должно работать, если класс наследуется от симфонийского контроллера
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
В дополнение к ответу shoomyst, если вы не хотите наследоваться от симфоневского контроллера, реализуйте интерфейс ContainerAwareInterface для вашего контроллера и забирайте из контейнера самостоятельно. Так же можно подключить трейт.

class MyController implements ContainerAwareInterface
{
    use \Symfony\Component\DependencyInjection\ContainerAwareTrait;

    function myAction(Request $request) {
        // ...
        $this->container->get('mailer')->send($message);
    }
}


#edited
Либо, как советует OnYourLips, если уж делаете контроллеры как сервисы, то делайте их правильно, с указанием всех зависимостей в конструкторе. Правда я считаю такой подход лишним, лучше просто держать тонкие контроллеры которые передают просто данные на обработку в сервис, и наша бизнес логика не зависит от HttpFoundation и минимально привязана к фреймворку.
Ответ написан
Quber
@Quber
PHP Team lead
Вы забыли в начале файла, где название класса указать наследуемость от симфонического класса extends Controller
Делается так
class YourController extends Controller
{
    public function showAction(Request $request) {
        // your actions
    }
}

Это позволит вызывать Вам mailer. Но как отметили выше, есть еще один подход, связанный с ContainerAwareInterface. Но я считаю это лишнее. Сделайте как у меня и всё.
Ответ написан
0neS
@0neS
Не нужен вам неймспейс мейлера, если вызываете его как сервис через get('mailer').
Убедитесь, что наследуете контроллер от Symfony\Bundle\FrameworkBundle\Controller\Controller;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы