如何在Laravel中将变量从Controller传递到Nova Resource?
你混淆了两个同名的NewsletterMail类:你Controller中引入的是App\Mail\NewsletterMail(邮件类),而你贴的是App\Nova\NewsletterMail(Nova后台资源类),二者完全独立,之前的传参尝试自然无法生效。以下是对应场景的解决方案:
需求1:给Nova后台资源的from字段设置统一默认值/占位符
该方案适合$defaultFrom全局统一的场景,是最推荐的实现方式:
- 把固定值写入配置文件,比如在
config/app.php中新增配置项:
return [ // 其他原有配置 'default_newsletter_from' => 'newsletter@stuttard.de', ];
- Controller中直接读取配置取值,不用硬编码:
public function send() { $defaultFrom = config('app.default_newsletter_from'); DB::table('newsletter_mails')->insert(['from' => $defaultFrom]); $emails = DB::select('select * from newsletters order by id desc'); foreach ($emails as $email) { Mail::to($email)->send(new NewsletterMail()); } }
- Nova资源类中也读取同一配置,值自然统一:
public function fields(Request $request) { return [ ID::make(__('ID'), 'id')->sortable(), Text::make('From', 'from') ->default(config('app.default_newsletter_from')) ->placeholder(config('app.default_newsletter_from')), ]; }
如果你的$defaultFrom是动态生成的非固定值,可以给NewsletterMail对应的Eloquent模型加静态属性存储:
- 先在
app/Models/NewsletterMail.php中定义静态属性:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class NewsletterMail extends Model { public static $defaultFrom = ''; }
- Controller中先给静态属性赋值再使用:
\App\Models\NewsletterMail::$defaultFrom = '你动态生成的发件人地址'; $defaultFrom = \App\Models\NewsletterMail::$defaultFrom;
- Nova中直接读取该静态属性即可:
->default(\App\Models\NewsletterMail::$defaultFrom) ->placeholder(\App\Models\NewsletterMail::$defaultFrom)
需求2:给邮件类App\Mail\NewsletterMail传参
如果你是需要把$defaultFrom传给邮件类用于发件人设置,修改对应的邮件类即可:
- 编辑
app/Mail/NewsletterMail.php,新增构造函数接收参数:
namespace App\Mail; use Illuminate\Mail\Mailable; class NewsletterMail extends Mailable { public $fromAddress; public function __construct($fromAddress) { $this->fromAddress = $fromAddress; } public function build() { return $this->from($this->fromAddress) ->view('你的邮件视图路径'); } }
- Controller中实例化邮件类时传入参数:
Mail::to($email)->send(new \App\Mail\NewsletterMail($defaultFrom));
内容的提问来源于stack exchange,提问作者Artur Müller Romanov
相关产品推荐
相关产品推荐

