在Laravel中将变量从Controller传递给Mailables [php]

时间:2017-06-28 07:44:18

标签: php laravel laravel-5.4

在我UserController我有一个功能

public function userFollow($id)
    {
        $authuser = Auth::user();
        $authuser->follow($id);
        //mail goes to the followiee ($id)
        $followiee = User::where('id', $id)->first();
        $to = $followiee->email;
        Mail::to($to)->send(new MyMail);
        return redirect()->back()->with('message', 'Following User');
    }

我还创建了一个Mailable MyMail

class MyMail extends Mailable
{
    use Queueable, SerializesModels;


    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.welcome');
    }
}

在我的欢迎电子邮件中,我需要访问$to中定义的UserController等变量

我在MyMail Mailable中尝试了以下内容:

 public function build()
    {
        return $this->view('emails.welcome',['to' => $to]);
    }

但我得到了Undefined variable: to

如何将变量从Controller传递给Mailables?

更新

到目前为止我尝试过:

UserController中

Mail::to($to)->send(new MyMail($to));

MyMail

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

    public function build()
    {
        return $this->view('emails.welcome');
    }

Welcome.blade.php

 {{ $to }}

错误:

FatalErrorException in Mailable.php line 442:
[] operator not supported for strings

2 个答案:

答案 0 :(得分:3)

一种解决方案是将变量传递给MyMail构造函数,如下所示:

<强> UserController中

Mail::to($to)->send(new MyMail($to));

<强> MyMail

public $myTo;

public function __construct($to)
{
    $this->myTo = $to;
}

public function build()
{
    return $this->view('emails.welcome');
}

<强> Welcome.blade.php

{{ $myTo }}

<强>更新 正如@Rahul在他的回答中指出的那样,$to属性可以被定义为公共属性。在这种情况下,view将自动填充。

更新2: 您只需要为$to变量(例如$myTo)指定一个不同的名称,以区别于$to中定义为Mailable.php的{​​{1}}

答案 1 :(得分:2)

您可以通过两种方式为视图提供数据。

  
      
  1. 首先,您的mailable类中定义的所有公共属性将自动提供给视图
  2.   
class MyMail extends Mailable
{
    use Queueable, SerializesModels;

    public $to;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($to)
    {
        $this->to = $to;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.welcome'); // $to will be automatically passed to your view
    }
}
  
      
  1. 其次,您可以通过with方法手动将数据传递到视图,但仍会通过可邮寄的类传递数据   构造函数;但是,您应该将此数据设置为受保护或   私有属性,因此数据不会自动提供给   模板。
  2.   
class MyMail extends Mailable
{
    use Queueable, SerializesModels;

      protected $to;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($to)
    {
        $this->to = $to;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.welcome',['to'=>$to]);


     }
    }