Slim - 路线上的Swift Mailer工作但是如果在控制器上移动后会出错

时间:2015-04-25 18:37:22

标签: php slim swiftmailer fortrabbit

我在苗条项目中添加了库slimcontroller和swift邮件程序, 当路线顺利时:

Route::get('/send', function() use ($app, $mailer) {

$message = Swift_Message::newInstance('Activation Code')
                ->setFrom(array('xxx@gmail.com' => 'xxx'))
                ->setTo(array('xxxs@gmail.com' => 'xxxs'))
                ->setBody('Test');

// Send the message
$results = $mailer->send($message);

// Print the results, 1 = message sent!
print($results);
});

但在控制器上运行后出现错误

class MyController extends \SlimController\SlimController
{

    public function getRegisters()
    {
        $data = (empty(\Session::flash())) ? array(
            'token' => \Token::getToken()
        ) : array_merge(\Session::flash(), array(
            'token' => \Token::getToken()
        ));

        return $this->render('auth/register.html', $data);
    }
    public function postRegisters()
    {
        $message = Swift_Message::newInstance('Activation Code')->setFrom(array(
            'xxx@gmail.com' => 'xxx'
        ))->setTo(array(
            'xxxs@gmail.com' => 'xxxs'
        ))->setBody('Test');

        // Send the message
        $results = $this->app->mailer->send($message);
    }
}

致命错误:在。中的非对象上调用成员函数send()。
我引自fortrabbit/slimcontroller

1 个答案:

答案 0 :(得分:1)

我猜这里(因为我没有完整的控制器代码),你的控制器$app是空的。 Slim不会在控制器中注入__construct对象。

有几种方法可以使用Slim注入依赖项。我不完全确定这里的最佳做法是什么。但我开始looking here

另外,你可以在你的控制器class Controller { protected $app; public function __construct() { $this->app = \Slim\Slim::getInstance(); } } 中做一些讨厌的黑客攻击。虽然我不推荐它,但它看起来像是:

$app

如果您确定您的控制器具有$mailer属性,则问题在于您如何注入$app实例。正如我从您的路线中看到的那样,您已将$mailer$app->mailer = function() { $mailer = new WhateverMailerYouAreUsing(); // ...config stuff... return $mailer; }; 传递给关闭。

你可以inject that mailer object into your app as a singleton。代码应该是这样的:

{{1}}