【问题标题】:Laravel - Pass custom data to email viewLaravel - 将自定义数据传递给电子邮件视图
【发布时间】:2018-08-02 15:26:38
【问题描述】:

继上一个问题之后,我设置了一个电子邮件控制器,以正确地将用户数据传递给视图。我现在正在尝试修改它,以便可以传递一些自定义数据。我的控制器看起来像这样......

namespace App\Mail;

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

class Welcome extends Mailable
{
    use Queueable, SerializesModels;

    public $email_data;

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

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

我正在发送这样的电子邮件...

  /* Create Data Array For Email */
        $email_data = array(
            'first_name'=>'John', 
            'last_name'=>'Doe', 
            'email'=>'john@doe.com',
            'password'=>'temp',
        );

        /* Send Email */
        Mail::to($user->email)->send(new Welcome($email_data));

这是正确的吗?当我尝试使用这种方法时,它似乎没有将数据传递给电子邮件模板。然后如何在视图中访问这些数据?

【问题讨论】:

  • 你不需要这部分->with(['email_data' => $this->email_data])如果属性是公开的,你可以在视图中访问它
  • 我试过没有那部分,但在视图中访问我得到未定义的变量:电子邮件。试过 $email 和 $email_data->email
  • 试试这个$email_data['email']
  • 试试return $this->view('emails.welcome', compact('email_data'))
  • @Maraboc - 完美,解决了!

标签: laravel laravel-5


【解决方案1】:

你试过这种方式吗?

namespace App\Mail;

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

class Welcome extends Mailable
{
    use Queueable, SerializesModels;

    public $data;

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

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

然后在您创建数据数组的控制器中,

$data = [
    'first_name'=>'John', 
    'last_name'=>'Doe', 
    'email'=>'john@doe.com',
    'password'=>'temp'
];

\Mail::to($user->email)->send(new Welcome($data));

请务必添加

use Mail;
use App\Mail\Welcome;

在您的控制器中。

您可以像这样访问视图中的数据

{{ $data['first_name'] }}
{{ $data['last_name'] }}
{{ $data['email'] }}
{{ $data['password'] }}

或

你也可以试试Markdown mails这个

【讨论】:

  • Markdown 是我的最佳选择
【解决方案2】:

您不需要这部分->with(['email_data' => $this->email_data]),因为如果该属性是公开的,您可以在视图中访问它。

而且您正在传递一个数组,因此您必须像这样访问值:

$email_data['email'] // ...

【讨论】:

    【解决方案3】:

    有两种方法可以通过视图传递数据。首先,在 mailable 类中定义的任何公共防御都会自动通过视图。

    <?php
    
    namespace App\Mail;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Mail\Mailable;
    use Illuminate\Queue\SerializesModels;
    
    class Welcome extends Mailable
    {
        use Queueable, SerializesModels;
        public $firstName;
        public $lastName;
        public $email;
        public $password;
        /**
         * Create a new message instance.
         *
         * @return void
         */
        public function __construct($firstName, $lastName, $email, $password)
        {
            $this->firstName = $firstName;
            $this->lastName = $lastName;
            $this->email = $email;
            $this->password = $password;
        }
    
        /**
         * Build the message.
         *
         * @return $this
         */
        public function build()
        {
            return $this->view('emails.orders');
        }
    }
    

    在刀片视图中

    <div>
        First Name: {{ $firstName }}
        Last Name: {{ $lastName }}
        Email: {{ $email }}
        Password: {{ $password }}
    </div>
    

    对于具有受保护和私有属性的变量,可以使用 with 方法通过视图传递数据

    namespace App\Mail;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Mail\Mailable;
    use Illuminate\Queue\SerializesModels;
    
    class Welcome extends Mailable
    {
        use Queueable, SerializesModels;
    
        protected $firstName;
        protected $lastName;
        protected $email;
        protected $password;
        /**
         * Create a new message instance.
         *
         * @return void
         */
        public function __construct($firstName, $lastName, $email, $password)
        {
            $this->firstName = $firstName;
            $this->lastName = $lastName;
            $this->email = $email;
            $this->password = $password;
        }
    
        /**
         * Build the message.
         *
         * @return $this
         */
        public function build()
        {
            return $this->view('emails.orders')->with([
                'first_name'=> $this->firstName, 
                ......
            ]);
        }
    }
    

    在刀片视图中

    <div>
        First Name: {{ $firstName }}
        Last Name: {{ $lastName }}
        Email: {{ $email }}
        Password: {{ $password }}
    </div>
    

    【讨论】:

      猜你喜欢
      • 2015-12-06
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2013-06-16
      相关资源
      最近更新 更多