Mail Laravel DB

Salut baietii, folosesc un paket pentru a trimite mail-uri in format HTML de pe Laravel… Ideea este ca nu stiu exact cum functioneaza, nu “ma prind” de idee.
Paketul este acesta: https://github.com/spatie/laravel-database-mail-templates
Dar atunci cand doresc sa creez un alt template, trebuie sa fac manual un alt fisier cu o alta clasa si toate cele… Cum trimite un mail in functie de ID-ul “mail_templates” din DB?..
Multumesc all.

Cam asa trimit:

$user = User::where('id',1)->first();
        Mail::to("[email protected]")->send(new ConfigMail($user));

ConfigMail = Campul mailable din DB.

Te-ai uitat pe documentatie si tot nu te-ai prins cum functioneaza?

Nu stiu cum functioneaza acest paket defapt: Paketul este acesta: https://github.com/spatie/laravel-database-mail-templates

Am facut acea trimitere la documentatie pentru a intelege mai intai cum functioneaza conceptul de Mail in Laravel. Cred ca odata ce intelegi lucrul acesta te vei lamuri si cum functioneaza pachetul respectiv.

Păi ai ditamai exemplul acolo…

Exemplu ca exemplu, l-am vazut… Ideea este ca nu stiu cum sa fac sa trimit un mail pe baza unui alt template din baza de date.
Functia asta: Mail::to($user->email)->send(new ConfigMail($user)); trimite un email pe baza a ceea ce este in DB, ideea este ca daca schimb ConfigMail + modific campul din baza de date cu noul nume schimbat, imi trimite mailul. Dar daca vreau sa adaug alt template mereu, trebuie sa fac manual un alt Controller/O alta clasa, cu numele noului template.
Nu e dinamic mai pe scurt.

E un simplu view cu variabile pe care le populezi cu ce date vrei când apelezi metoda.

Within a mailable class’ build method, you may use the view method to specify which template should be used when rendering the email’s contents.

Citește toată pagina din documentație cu atentie, cum ți s-a recomandat și mai sus.:slightly_smiling_face:

1 Like

Da-mi te rog un exemplu ca nu i-am dat de cap in 2 zile, ma invart in jurul cozii de Vineri…
Apreciez.

Sincer sa fiu nu stiu daca as fi mai elocvent decat ce este in documentatie.
In momentul in care trimiti e-mailul, continutul static nu se preia din baza de date ci dintr-un view. Daca nu specific niciunul probabil preia ceva default.

    public function build()
    {
        return $this->view('aici pui template-ul de e-mail')
                    ->with([
                        'orderName' => $this->order->name, // aici, ca la orice view, sunt specificate datele transferate spre view
                        'orderPrice' => $this->order->price, 
                    ]);
    }

Adauga codul tau, unde trimiti e-mailul.

Preia din baza de date, am testat mail-urile trimise, ce modific in baza de date asa se si trimite.
Functia este se ocupa de query:

public function scopeForMailable(Builder $query, Mailable $mailable): Builder
    {
        return $query->where('mailable', get_class($mailable));
    }

Daca schimb mailable cu id si in loc de get_class pun 2, e ok. Dar nu stiu cum sa iau id-ul de la clasa respectiva.

pai ideea-i s nu te folosesti de id-uri. vrei sa trimiti un welcome mail, faci o clasa care se cheama WelcomeMail, extinzi clasa de baza (mailable or whatever), si te folosesti de noua clasa ca sa trimiti mailuri.

Imi cer scuze dar am citit pe diagonala. Am vazut doar link-ul spre documentatia Laravel, pusa de Cosmin, nu am vazut si ca folosesti pachetul respectiv.
Nu am folosit pachetul si nici cu PHP nu am mai lucrat de un an, sper sa nu te derutez sau sa zic vreo prostie :smiley: .

Daca te uiti in migratie observi ca ai o tabela mail_templates, unde se inregistreaza id-ul si unde ai si o coloana mailable.

        Schema::create('mail_templates', function (Blueprint $table) {
            $table->increments('id');
            $table->string('mailable');
            $table->text('subject')->nullable();
            $table->text('html_template');
            $table->text('text_template')->nullable();
            $table->timestamps();
        });

Mai jos in documentatie am gasit ca asa inregistrezi un template, unde se observa ca mailable este inregistrat cu numele clasei.

MailTemplate::create([
    'mailable' => WelcomeMail::class,
    'subject' => 'Welcome, {{ name }}',
    'html_template' => '<p>Hello, {{ name }}.</p>',
    'text_template' => 'Hello, {{ name }}.'
]);

Daca vrei sa ai mai multe template-uri pentru aceeasi clasa va trebui sa mai adaugi conditii si fie sa modifici modelul fie sa modifici migratia si sa mai adaugi un camp. Sau ma rog, daca ai alte idei…

return $query->where('mailable', get_class($mailable)-where>('id', id-ul template-ului));

$query->where('mailable', get_class($mailable) - partea asta presupune ca ai un singur template pentru numele respectiv(clasa respectiva), insa probabil tu ai mai multe. De ce nu faci un dump la ce iti returneaza?
Dar cum s-a zis si mai sus, este facut sa creezi o clasa pentru fiecare template.

Am rezolvat, multumiri tuturor.