Ошибка: вызов функции-члена get () для не-объекта

Я пытаюсь отправить почту с 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)); } 

Related of "Ошибка: вызов функции-члена get () для не-объекта"

Как упоминала Керада, вы получаете ошибку, поскольку контейнер не установлен. Одним из способов устранения этой проблемы было бы передать экземпляр контейнера в ваш пакет, чтобы вы могли вызывать контейнер из любого места вашего проекта.

Отредактируйте класс, соответствующий вашему набору (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');