首页 > 解决方案 > 如何从 Controller 调用 Mailable 函数?

问题描述

我是 laravel 的新手,并且完成了laravel 可邮寄的文档,该文档以如下所示结束了我mailable

ContactMail.php

<?php

namespace App\Mail;

use http\Env\Request;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;


class ContactMail extends Mailable implements ShouldQueue
{
  use Queueable, SerializesModels;

  public function __construct()
  {
    //
  }

  public function build()
  {

    return $this->markdown('emails.contact');
  }

  public function store(Request $request)
  {

    $contactVar = 'hello world!';

    Mail::to($request->user())->send(new contact($contactVar));

  }
}

我希望从我的调用store这个函数:mailableContactController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;


class ContactController extends Controller
{
  public function submit(Request $request) {
    $this->validate($request, [
      'name' => 'required',
      'email' => 'required | email',
      'message' => 'required'
    ]);
    
    // store(...)
    
    return response()->json(null, 200);
  }
}

我将如何调用该函数,这是一种好习惯吗?抱歉,如果很明显,我正在尝试掌握Laravel/PHP.

这是对应的email template file( contact.blade.php):

@component('mail::message')
# Introduction

The body of your message.

@component('mail::button', ['url' => ''])
Button Text
@endcomponent

Thanks,<br>
{{ config('app.name') }}
@endcomponent

标签: phplaravelemail

解决方案


如果你想使用视图,你的邮件应该在store方法中返回视图。你可以在这里阅读。

所以你的邮件应该看起来更像这样:

class ContactMail extends Mailable implements ShouldQueue
{
  // the rest of the code

  public function store(Request $request)
  {
    return $this->view('contact');
  }
}

然后您可以Controller像这样向用户发送邮件:

Mail::to($request->user())->send(new ContactMail());

你可以在这里读到什么。


此外,如果您想在视图中使用变量,可以使用with方法,并且可以在其中传递带有命名变量的关联数组:

public function store(Request $request)
{
  return $this->view('contact')
              ->with(['contactVariable' => 'hello world!']);
}

要使用此变量,您只需输入$contactVariable视图模板。


推荐阅读