Я пытаюсь отправить почту с Swift_Message, однако, когда я иду отправлять данные, которые он не отправит, и я получаю сообщение об ошибке
FatalErrorException: Ошибка: вызов функции-члена get () для не-объекта в строке /vagrant/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php 252
Вот контроллер электронной почты, который я использую.
use Symfony\Component\Finder\Shell\Command; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\DependencyInjection\ContainerInterface; class EmailController extends Controller{ public function createMessage($subject, $from, $from_name, $to, $to_name, $body){ // Create the message $message = \Swift_Message::newInstance() // Give the message a subject ->setSubject($subject) // Set the From address with an associative array ->setFrom(array($from => $from_name)) // Set the To addresses with an associative array ->setTo(array($to => $to_name)) // Give it a body ->setBody($body, 'text/html'); return $message; } public function sendEmail($message, $urlAlias){ $this->get('mailer')->send($message); return $this->redirect($this->generateUrl($urlAlias)); } }
Я понимаю, что он не может получить доступ к объекту, который, как я думаю, является частью класса контейнера, но я могу заставить его подтянуться. Я попытался использовать $this->container->get(...
но это также не работает. Что мне не хватает. Похоже, это должно быть действительно прямо.
Я вызываю эту функцию из другого набора, используя действие для вызова текущего контроллера. Я не знаю, имеет ли это значение.
Итак, при просмотре /vagrant/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php
Строка, на которой он
/** * Gets a service by id. * * @param string $id The service id * * @return object The service */ public function get($id) { return $this->container->get($id); } }
Что заставляет меня чувствовать себя «почтой»; не является хорошим $ id, но он используется в примерах Symfony и во многих других частных примерах.
Не знаю, помогло это или нет, но подумал, что стоит упомянуть.
Может ли это быть из-за swiftmailer: установка внутри моего файла config.yml?
Файл routing.yml
fuel_form_homepage: pattern: /hello/{name} defaults: { _controller: FuelFormBundle:Default:index } referral_form: pattern: /form/referral/{hash} defaults: { _controller: FuelFormBundle:Form:referralForm } referral_result: pattern: /form/referral/result defaults: { _controller: FuelFormBundle:Form:referralResult } user_form: pattern: /form/user defaults: { _controller: FuelFormBundle:Form:userForm } home: pattern: / defaults: { _controller: FuelFormBundle:Default:home}
Это функция, которая вызывает
public function userFormAction(request $request){ $user = new User(); $form = $this->createForm('user', $user); $form->handleRequest($request); if($form->isValid()){ $user->setTimeCreated(); $user->setTimeUpdated(); $date = $user->getTimeCreated(); $timestamp = $date->format("U"); $hash = $user->getFirstName() . $user->getLastName() . $timestamp ; $user->setUserHash(md5($hash)); $em = $this->getDoctrine()->getManager(); $em->persist($user); $em->flush(); print_r($user); //TODO: @Email: @Body: make sure to replace with correct information. //Calls a service named email_bundle_controller $emailController = $this->get('email_bundle_controller'); $fullName = $user->getFirstName() . $user->getLastName(); $body = "please visit the following url to start referring! <a href='http://localhost:8080/app_dev.php/form/referral/" . $user->getUserHash() . "'>Your URL</a>"; $message = $emailController->createMessage('Welcome to Fuel PRM References', 'bsaverino@gmail.com', 'Brad Saverino', $user->getEmail(), $fullName, $body); $emailController->sendEmail($message, 'user_form'); } return $this->render('FuelFormBundle:Default:mainForm.html.twig', array('form' => $form->createView(),)); }
Это сервис, который позволяет мне вызвать другой пакет.
services: fuel_form.form.type.referral: class: Fuel\FormBundle\Form\Type\ReferralType tags: - { name: form.type, alias: referral} fuel_form.form.type.user: class: Fuel\FormBundle\Form\Type\UserType tags: - { name: form.type, alias: user} email_bundle_controller: class: Fuel\EmailBundle\Controller\EmailController
Это FuelEmailBundle.php
namespace Fuel\EmailBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; use \Symfony\Component\DependencyInjection\ContainerInterface; class FuelEmailBundle extends Bundle { private static $containerInstance = null; public function setContainer(ContainerInterface $container = null) { parent::setContainer($container); self::$containerInstance = $container; } public static function getContainer() { return self::$containerInstance; } }
Это изменения, внесенные в функцию sendEmail
public function sendEmail($message, $urlAlias){ $container = FuelEmailBundle::getContainer(); $mailer = $container->get('mailer'); $mailer->send($message); return $this->redirect($this->generateUrl($urlAlias)); }
Как упоминала Керада, вы получаете ошибку, поскольку контейнер не установлен. Одним из способов устранения этой проблемы было бы передать экземпляр контейнера в ваш пакет, чтобы вы могли вызывать контейнер из любого места вашего проекта.
Отредактируйте класс, соответствующий вашему набору (BundleName.php), чтобы включить два метода setContainer и getContainer. См. Пример ниже.
namespace Venom\CoreBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; use \Symfony\Component\DependencyInjection\ContainerInterface; class VenomCoreBundle extends Bundle { private static $containerInstance = null; public function setContainer(ContainerInterface $container = null) { parent::setContainer($container); self::$containerInstance = $container; } public static function getContainer() { return self::$containerInstance; } }
Используйте соответствующие пространства имен. Затем используйте пространство имен для пакета в классах, где вам нужен контейнер. Вы можете вызвать контейнер
$container = VenomCoreBundle::getContainer();
Затем вызовите почтовую программу
$mailer = $container->get('mailer');