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.

InformationsquelleAutor B Rad | 2013-09-24
Schreibe einen Kommentar