Error: Call to a member function get() on a non-object
Ich bin versucht, senden Sie eine mail mit Swift_Message aber wenn ich gehe, Daten zu senden, wird es nicht senden und ich bekomme eine Fehlermeldung von
FatalErrorException: Error: Call to a member function get() on a
non-object in
/vagrant/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php
Linie 252
Hier ist die E-Mail-Controller, den ich verwende.
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));
}
}
Ich verstehe, dass Ihr nicht in der Lage, auf das Objekt zuzugreifen, die ich denke, ist Teil der container-Klasse, aber ich kann scheinen, um es nach oben zu ziehen. Ich habe versucht mit $this->container->get(...
aber das funktioniert auch nicht. Was vermisse ich. Dies scheint, wie es sollte wirklich geradeaus.
Rufe ich diese Funktion von einem anderen bundle mit einer Aktion aufrufen, um die aktuellen controller. Ich weiß nicht, ob das einen Unterschied macht.
Ok so, wenn man in /vagrant/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php
Die Linie Fehler auf, ist
/**
* Gets a service by id.
*
* @param string $id The service id
*
* @return object The service
*/
public function get($id)
{
return $this->container->get($id);
}
}
Denen fühle ich mich wie 'mailer; ist nicht eine gute $id, aber es wird in Symfony Beispiele und in viele andere private Beispiele.
Weiß nicht, ob das hilft oder nicht, aber dachte, es war der Rede Wert.
Könnte dies sein, weil der swiftmailer: Einstellung in meiner config.yml-Datei?
routing.yml-Datei
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}
Dies ist die Funktion, dass Anrufe
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', '[email protected]', 'Brad Saverino', $user->getEmail(), $fullName, $body);
$emailController->sendEmail($message, 'user_form');
}
return $this->render('FuelFormBundle:Default:mainForm.html.twig', array('form' => $form->createView(),));
}
Dies ist der Dienst, der mir erlaubt, zu rufen, auf der anderen bundle.
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
Dies ist die 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;
}
}
Diese änderungen wurden vorgenommen, um die Funktion sendEmail
public function sendEmail($message, $urlAlias){
$container = FuelEmailBundle::getContainer();
$mailer = $container->get('mailer');
$mailer->send($message);
return $this->redirect($this->generateUrl($urlAlias));
}
- Ich kann diese Arbeit ohne Fehler, wenn ich alles in der gleichen Steuerung.
- Können Sie Ihre route Definitionen?
- Ist, dass das routing.yml-Datei? Gerade Hinzugefügt wurden.
- Ok, also, wenn
sendMail
aufgerufen wird, ist es vom einen Ereignis-hook, oder sind Sie tatsächlich eine Anforderung generieren, um diesen controller? - Der Fehler ist, da der container ist nicht festgelegt. Sie versuchen, Ihre E-Mail-Prüfer, der ist, warum der container nicht festgelegt. Post code zeigt, wie createMessage-Methode aufgerufen wird.
- Ich habe gerade gebucht, der Aufruf zu createMessage-Methode und die Dienstleistung zu nennen, die anderen Bündel. Ich danke Ihnen für das ansehen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Cerad oben schon erwähnt hatte, bekommen Sie die Fehlermeldung als container ist nicht festgelegt. Eine Möglichkeit, dieses Problem zu beheben, wäre, einen container übergeben Beispiel Ihren bündeln, so dass Sie rufen Sie die container von überall in Ihrem Projekt.
Bearbeiten Sie die Klasse entsprechend Ihrem bundle - (BundleName.php") um zwei Methoden setContainer und getContainer. Siehe das Beispiel unten.
Verwenden Sie die entsprechenden namespaces.
Verwenden Sie dann den namespace für die bundle-Klassen, in denen Sie benötigen den container.
Sie können rufen Sie die container von
$container = VenomCoreBundle::getContainer();
Dann rufen Sie die mailer
$mailer = $container->get('mailer');
$container = FuelFormBundle::getContainer();
und rufen Sie die Funktion wie folgt$container->sendEmail($message, 'user_form');
dann bekomme ich eine Fehlermeldung FatalErrorException: Error: Call to undefined method appDevDebugProjectContainer::sendEmail() in /vagrant/src/Fuel/FormBundle/Controller/FormController.php Linie 76. Das macht Sinn, denn jetzt hat es keine Methode zum finden der Funktion. Bin ich etwas fehlt.