代码之家  ›  专栏  ›  技术社区  ›  Leon Segal

Laravel作业/通知失败

  •  0
  • Leon Segal  · 技术社区  · 6 年前

    我正在尝试在我的网站上设置一个联系人表单,当有人单击“发送”,然后运行一个作业,在该作业中,会向所有管理员用户发送通知。但是,我在失败的作业表中不断出现此错误:

    Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Contact]. in /var/www/html/leonsegal/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:412
    

    我把我的代码弄得一团糟,看不出我做错了什么。有人能帮忙吗?

    这是我的控制器:

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Contact;
    use App\Jobs\SendContactJob;
    
    class ContactController extends Controller
    {
        /**
         * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
         */
        public function create()
        {
            return view('contact');
        }
    
        public function store()
        {
            request()->validate([
                'name' => 'required|max:255',
                'email' => 'required|email|unique:contacts|max:255',
                'message' => 'required|max:2000',
            ]);
    
            $contact = Contact::create(
                request()->only([
                    'name',
                    'email',
                    'message',
                ])
            );
    
            SendContactJob::dispatch($contact);
    
            return back()->with('success', 'Thank you, I will be in touch as soon as I can');
        }
    }
    

    我的工作:

    <?php
    
    namespace App\Jobs;
    
    use App\Contact;
    use App\Notifications\SendContactNotification;
    use App\User;
    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\Notification;
    
    class SendContactJob implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        protected $contact;
    
        /**
         * Create a new job instance.
         *
         * @param Contact $contact
         */
        public function __construct(Contact $contact)
        {
            $this->contact = $contact;
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            $users = User::all()
                ->where('admin', 1)
                ->where('approved', 1);
    
            Notification::send($users, new SendContactNotification($this->contact));
        }
    }
    

    我的通知:

    <?php
    
    namespace App\Notifications;
    
    use App\Contact;
    use Illuminate\Bus\Queueable;
    use Illuminate\Notifications\Notification;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Notifications\Messages\MailMessage;
    
    class SendContactNotification extends Notification implements ShouldQueue
    {
        use Queueable;
    
        protected $contact;
    
        /**
         * Create a new notification instance.
         *
         * @param $contact
         */
        public function __construct(Contact $contact)
        {
            $this->contact = $contact;
        }
    
        /**
         * Get the notification's delivery channels.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function via($notifiable)
        {
            return ['mail'];
        }
    
        /**
         * Get the mail representation of the notification.
         *
         * @param  mixed  $notifiable
         * @return \Illuminate\Notifications\Messages\MailMessage
         */
        public function toMail($notifiable)
        {
            return (new MailMessage)
                        ->line($this->contact->name)
                        ->line($this->contact->email)
                        ->line($this->contact->message);
        }
    
        /**
         * Get the array representation of the notification.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function toArray($notifiable)
        {
            return [
                //
            ];
        }
    }
    

    奇怪的是,当我在作业的handle方法中运行一个die dump时,它从不激发,但是Artisan队列工作者说它处理正确,但随后的通知是失败的地方。我不知道为什么工作中的句柄方法不会被解雇。

    我已经将.env文件设置为数据库队列驱动程序。

    我想可能是我没有导入联系人模型,但是你可以看到我已经导入了。

    任何帮助都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  1
  •   John Halsey    6 年前

    可能是因为作业和通知都在排队,所以可以说,联系人可能在传输过程中“丢失”。尝试使作业不可排队,并且只将通知排队(或相反)。或者完全放弃作业,只需从控制器发送通知。