2015-04-25 2 views
1

добавить библиотеки slimcontroller и быстрый почтовик в моем тонком проекте, когда маршрут идет хорошо:Slim - 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

В какой-то момент вы должны сделать '$ app-> mailer = $ mailer', чтобы ваш код работал. –

+0

@Mika. если это место кода в маршруте работает, но если место в контроллерах равно нулю. –

ответ

1

Я просто предполагаю здесь (так как я не»иметь свой полный код контроллера), что ваш диспетчерское $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; 
}; 
+0

hai, @fedeisas. Я обновил контроллер. Объект slimcontroller

$app
автоматически вводится в контроллеры. –

+0

@Defri Я обновил свой ответ, чтобы объяснить, как ввести объект '$ mailer' в ваше приложение и ссылку на документы Slim DI. Повеселись! – fedeisas

+1

спасибо за использование ссылки Slim DI. да .. Я успешно использовал swiftmailer в своем контроллере. Этот документ swiftmailer конфигурации в моей [gist] (https://gist.github.com/defriblackertz/b921af501e206f0a476a). Спасибо вам за помощь. –

Смежные вопросы