这是我第一次在Laravel / Lumen使用活动。
我实际上正在使用Lumen,当新用户注册以便在后台发送电子邮件时,我正在尝试调度Mailable的实例。
我相信我已经设置正确,但我一直收到这个错误......
类型错误:传递给Illuminate \ Mail \ Mailable :: queue()的参数1必须实现接口Illuminate \ Contracts \ Queue \ Factory,给出的Illuminate \ Queue \ DatabaseQueue实例
我实际上无法在错误消息中看到问题来自哪里,例如没有行号。
然而,这是我的代码......
AuthenticationContoller.php
$this->dispatch(new NewUser($user));
NewUser.php
<?php
namespace App\Mail;
use App\Models\User;
use Illuminate\Mail\Mailable;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class NewUser extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('test')->to('test@test.com', 'Test')
->from('test@test.com', 'test')->replyTo('test@test.com', 'test')
->subject('Welcome to the blog!');
}
}
答案 0 :(得分:1)
我遇到了同样的问题。看起来Lumen和Illuminate / Mailer并没有很好地协同工作。
但是我在a Github thread找到了一个很容易解决的问题。
基本上,您只需在app / Providers目录中创建一个新的服务提供商。
MailServiceprovider.php
<?php
namespace App\Providers;
use Illuminate\Mail\Mailer;
use Illuminate\Mail\MailServiceProvider as BaseProvider;
class MailServiceProvider extends BaseProvider
{
/**
* Register the Illuminate mailer instance.
*
* @return void
*/
protected function registerIlluminateMailer()
{
$this->app->singleton('mailer', function ($app) {
$config = $app->make('config')->get('mail');
// Once we have create the mailer instance, we will set a container instance
// on the mailer. This allows us to resolve mailer classes via containers
// for maximum testability on said classes instead of passing Closures.
$mailer = new Mailer(
$app['view'], $app['swift.mailer'], $app['events']
);
// The trick
$mailer->setQueue($app['queue']);
// Next we will set all of the global addresses on this mailer, which allows
// for easy unification of all "from" addresses as well as easy debugging
// of sent messages since they get be sent into a single email address.
foreach (['from', 'reply_to', 'to'] as $type) {
$this->setGlobalAddress($mailer, $config, $type);
}
return $mailer;
});
$this->app->configure('mail');
$this->app->alias('mailer', \Illuminate\Contracts\Mail\Mailer::class);
}
}
然后您只需在bootstrap/app.php
中注册此服务提供商,而不是默认的服务提供商,只需添加以下行:
$app->register(\App\Providers\MailServiceProvider::class);