1

ルートがうまくいくと、ライブラリslimcontrollerとswift mailerをslimプロジェクトに追加します。

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);
    }
}

致命的なエラー: 非オブジェクト in でメンバ関数 send() を呼び出しています 。fortrabbit/slimcontroller
から参照しています

4

1 に答える 1

1

ここでは、コントローラーの完全なコードを持っていないため、コントローラー$this->appが空であると推測しています。$appSlim はコントローラにオブジェクトを注入しません。

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;
};
于 2015-04-25T22:51:18.177 に答える