Проблемы с очередями Laravel, когда я передаю данные с контроллера на задания - PullRequest
0 голосов
/ 10 марта 2019

У меня проблема с исправлением части очереди для Laravel.

У меня есть контактная форма, которая отлично работает.Я отправляю форму, и мне отправляется письмо с подробностями ввода из формы.

Но проблема в том, что если вы не используете очереди Laravel, то UX не хватает из-за времени ожидания перед отправкой почты и после получения сообщения об успехе.

Так что теперь я хочу реализовать часть очереди, но я не делаю это правильно.Я все еще новичок в этом ...

Вот мой контроллер

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'] = 'test@test.com';

        $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('test@test.dk');
        Mail::to('admin@admin.dk')->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('test@test.dk')->view('mail.kontaktform');
    }
}

kontaktform.blad.php

{{$request['email']}}

Ответы [ 2 ]

1 голос
/ 10 марта 2019

В вашем kontaktform.blad.php (который должен называться kontaktform.blade.php btw) вы ожидаете, что данные будут массивом, потому что вы пытаетесь получить индекс ['email'], хотя в вашем SendEmailJob.php в методе handle() вы передать вашу электронную почту в виде строки.

Итак, что вы должны изменить на следующее:

$email = new SendEmailMailable(['email' => 'test@test.dk']);

или выполните следующие действия в контроллере и в задании:

Контроллер:

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

Работа:

protected $request;

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

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    $mailable = new SendEmailMailable($this->request);
    Mail::to('admin@admin.dk')->send($mailable);

}

Теперь все данные из запроса должны быть доступны в вашем блейд-шаблоне.

0 голосов
/ 26 марта 2019

Я нашел проблему. Я не передал данные из почтового сообщения на мой блейд

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