Slim - Swift 路由上的 Mailer 可以正常工作,但如果在控制器上移动后会出现错误
Slim - Swift Mailer on the route is work but if after moved on controller get errors
我在我的 slim 项目中添加库 slimcontroller 和 swift mailer,
当路线顺利时:
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
我只是猜测(因为我没有您的完整控制器代码)您控制器的 $this->app
是空的。 Slim 不会在您的控制器中注入 $app
对象。
有几种方法可以使用 Slim 注入依赖项。我不完全确定这里的最佳做法是什么。但我会开始 looking here.
另外,您可以在您的控制器中做一些讨厌的黑客攻击 __construct
。虽然我不推荐它,但它看起来像:
class Controller {
protected $app;
public function __construct()
{
$this->app = \Slim\Slim::getInstance();
}
}
如果您确定您的控制器具有 $app
属性,那么问题在于您如何注入 $mailer
实例。正如我从您的路线中看到的那样,您将 $app
和 $mailer
都传递给闭包。
你可以inject that mailer object into your app as a singleton。代码应该是这样的:
$app->mailer = function() {
$mailer = new WhateverMailerYouAreUsing();
// ...config stuff...
return $mailer;
};
我在我的 slim 项目中添加库 slimcontroller 和 swift mailer, 当路线顺利时:
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
我只是猜测(因为我没有您的完整控制器代码)您控制器的 $this->app
是空的。 Slim 不会在您的控制器中注入 $app
对象。
有几种方法可以使用 Slim 注入依赖项。我不完全确定这里的最佳做法是什么。但我会开始 looking here.
另外,您可以在您的控制器中做一些讨厌的黑客攻击 __construct
。虽然我不推荐它,但它看起来像:
class Controller {
protected $app;
public function __construct()
{
$this->app = \Slim\Slim::getInstance();
}
}
如果您确定您的控制器具有 $app
属性,那么问题在于您如何注入 $mailer
实例。正如我从您的路线中看到的那样,您将 $app
和 $mailer
都传递给闭包。
你可以inject that mailer object into your app as a singleton。代码应该是这样的:
$app->mailer = function() {
$mailer = new WhateverMailerYouAreUsing();
// ...config stuff...
return $mailer;
};