【问题标题】:How to call Mailable function from Controller?如何从 Controller 调用 Mailable 函数?
【发布时间】:2021-11-24 15:04:16
【问题描述】:

我是 laravel 的新手,通过 laravel mailable doc 工作,最后我得到了一个看起来像这样的 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));

  }
}

我希望从我的 ContactController.php 调用此 mailablestore 函数:

<?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 filecontact.blade.php):

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

The body of your message.

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

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

【问题讨论】:

标签: php laravel email


【解决方案1】:

我的意见是创建一个工作并将邮件负载分派给这个工作。工作结构如下图:

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class SendMail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

   
    protected $email;
    public function __construct($email)
    {
        $this->email = $email;
    }

    
    public function handle()
    {
        Mail::to($this->email)->send(new ContactMail());
    }
}

然后像这样从您的控制器提交方法中分派作业。

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

}

从 ContactMail.php 文件中删除 store 方法

【讨论】:

    【解决方案2】:

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

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

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

    您可以阅读的内容here


    另外,如果你想在你的视图中使用变量,你可以使用with 方法,在那里你可以传递带有命名变量的关联数组:

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

    要使用这个变量,您只需在视图模板中输入$contactVariable

    【讨论】:

    • 嘿,这似乎可行,但现在我收到了local.ERROR: cURL error 60: SSL certificate problem: unable to get local issuer certificate。知道如何解决这个问题吗?我没有安装xamp/wamp,但我只是使用artisan server
    • here
    • 我知道,但是这个解决方案不适合xamp/wamp 用户吗?我只是使用artisan server。还是默认集成xamp
    • 所以cURL 错误消失了,但ContactController.php 中的ContactMail 函数似乎没有调用store 函数。
    • 好像没有调用store函数,什么意思?你目前的结果是什么,你想做什么,你尝试过什么?请通读help center,尤其是How do I ask a good question?,并用minimal reproducible example 更新您的问题以证明问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多