Slim — Swift Mailer на маршруте работает, но если после перемещения на контроллере получаются ошибки

Я добавляю библиотеки slimcontroller и swift mailer в свой тонкий проект,
когда в маршруте идет хорошо

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

$message = Swift_Message::newInstance('Activation Code')
->setFrom(array('[email protected]' => 'xxx'))
->setTo(array('[email protected]' => '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(
'[email protected]' => 'xxx'
))->setTo(array(
'[email protected]' => 'xxxs'
))->setBody('Test');

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

Неустранимая ошибка: вызов функции-члена send () для необъекта в.

Я ссылаюсь на fortrabbit / slimcontroller

1

Решение

Я просто догадываюсь здесь (так как у меня нет вашего полного кода контроллера), что ваш контроллер $this->app пустой. Тонкий не будет вводить $app объект в ваших контроллерах.

Есть несколько способов внедрить зависимости с помощью Slim. Я не совсем уверен, какова лучшая практика здесь. Но я бы начал смотрите здесь.

Кроме того, вы можете сделать некоторые неприятные взломать в ваших контроллерах __construct, Хотя я не рекомендую это, это будет выглядеть примерно так:

class Controller {
protected $app;
public function __construct()
{
$this->app = \Slim\Slim::getInstance();
}
}

Если вы уверены, что ваш контроллер имеет $app собственность, то проблема в том, как вы вводите свой $mailer пример. Как я вижу из ваших маршрутов, вы проезжаете оба $app и $mailer до закрытия.

Вы можете внедрить этот почтовый объект в ваше приложение как singleton. Код должен быть примерно таким:

$app->mailer = function() {
$mailer = new WhateverMailerYouAreUsing();
// ...config stuff...

return $mailer;
};
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]