Search code examples
laravel-5.6laravel-queue

Laravel queues issues when I pass data from controller to jobs


I'm having issue fixing the queue part for Laravel.

I have a contact form which works perfectly. I submit the form and a mail is being sent to me with the input details from the form.

But the issue is that if you do not use the Laravel Queues then the UX is lacking because of the waiting time before the mail is being sent and after getting the success message.

So now I want to implement the queuing part, but im not doing it right. Im still a noob at it...

Here is my controller

KontaktformController.php

<?php

namespace App\Http\Controllers;

use App\Jobs\SendEmailJob;
use Carbon\Carbon;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Session;
use App\Kontaktform;
use Illuminate\Http\Request;
use App\Mail\SendEmailMailable;

class KontaktformController extends Controller
{

    public function create()
    {
        return view('kontakt');
    }


    public function store(Request $request) {
        $this->validate($request, [
            'name' => 'required|string',
            'mobile' => 'required',
            'email' => 'required|email',
            'subject' => 'required',
            'message' => 'required',
        ]);
        /*
          Add mail functionality here.*/

        $kontakt = new Kontaktform([
            'navn'  => $request['name'],
            'mobilnr' => $request['mobile'],
            'fastnetnr' => $request['landline'],
            'mail' => $request['email'],
            'emne' => $request['subject'],
            'beskrivelse' => $request['message']
        ]);
        $kontakt->save();

        //$user['email'] = '[email protected]';

        $job = (new SendEmailJob($request['email']))
            ->delay(Carbon::now()->addSeconds(3));

        dispatch($job);


    }
    }

SendEmailJob.php

<?php

namespace App\Jobs;

use App\Mail\SendEmailMailable;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Mail;

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

    protected $user;

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

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $email = new SendEmailMailable('[email protected]');
        Mail::to('[email protected]')->send($email);

    }
}

SendEmailMailable.php

<?php

namespace App\Mail;

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

class SendEmailMailable extends Mailable
{
    use Queueable, SerializesModels;


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

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('[email protected]')->view('mail.kontaktform');
    }
}

kontaktform.blad.php

{{$request['email']}}

Solution

  • I found the issue. I didnt pass data from mailable to my blade

    public function build()
        {
            return $this->view( 'mail.kontaktform' )->with( [
                'request' => $this->request,
            ] );
        }