gpt4 book ai didi

php - 错误 : Call to a member function get() on a non-object

转载 作者:行者123 更新时间:2023-12-02 07:33:50 24 4
gpt4 key购买 nike

我正在尝试使用 Swift_Message 发送邮件,但是当我去发送数据时它不会发送并且我收到错误

FatalErrorException: Error: Call to a member function get() on a non-object in /vagrant/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php line 252

这是我正在使用的电子邮件 Controller 。

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(...

但这也行不通。我错过了什么。这似乎应该是非常简单的。

我正在使用调用当前 Controller 的操作从不同的包调用此函数。我不知道这是否有所作为。


好的,所以在查看/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);
}
}

这让我觉得自己像个“ postman ;不是一个好的 $id 但它被用在 Symfony 的例子和许多其他私有(private)例子中。

不知道这是否有帮助,但认为值得一提。

这可能是因为我的 config.yml 文件中的 swiftmailer: 设置?

路由.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));
}

最佳答案

正如 Cerad 上面提到的,您收到错误消息是因为未设置容器。解决此问题的一种方法是将容器实例传递给您的包,以便您可以从项目中的任何位置调用该容器。

编辑与您的包 (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;
}
}

使用适当的命名空间。然后,在需要容器的类中使用包的 namespace 。您可以通过以下方式调用容器

$container = VenomCoreBundle::getContainer();

然后,调用邮件程序

$mailer = $container->get('mailer');

关于php - 错误 : Call to a member function get() on a non-object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18991865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com