Php LARAVEL 7:ErrorException未定义索引

Php LARAVEL 7:ErrorException未定义索引,php,laravel,email,Php,Laravel,Email,我在电子邮件html模板中使用数组索引时遇到了一个错误,尽管该索引被定义为同一数组中的其他索引 在电子邮件模板中使用牵连索引时会出现问题。就我不使用它而言,事情如下所述 事情从控制器发送电子邮件的功能开始 public function sendToOne(Request $request){ if ($request->ajax()) { $this->validate($request, [ 'user_id'

我在电子邮件html模板中使用数组索引时遇到了一个错误,尽管该索引被定义为同一数组中的其他索引

在电子邮件模板中使用牵连索引时会出现问题。就我不使用它而言,事情如下所述

事情从控制器发送电子邮件的功能开始

   public function sendToOne(Request $request){
        if ($request->ajax()) {
            $this->validate($request, [
            'user_id'=>'required',
            'infoletter_id'=>'required'
            ]);
            Log::debug('entering sendToOne with user_id '.$request->user_id);
            $infoletter=Infoletter::find($request->infoletter_id);
            $user=User::find( $request->user_id);
            $sender=User::find(1);
            $details=[
                'title'=>$infoletter->title,
                'body'=>$infoletter->body,
                'sender'=>$sender,
                'user'=>$user,
            ];
            $job=(new SendEmailJob($details))->delay($request->delay);
            dispatch($job);
            $duree=$request->delay;
            $minutes=intval(($duree % 3600) / 60);
            $secondes=intval((($duree % 3600) % 60));
            return response()->json(['success'=>'Envoi de l\'infolettre programmé pour '.$user->firstname.' '.$user->familyname .'. L\'envoi aura lieu dans '.$minutes.' minutes et '.$secondes.' secondes.']);
        }
        else{ return 'request is not ajax';}
    }
所涉及的数组是$details,我在其中传递邮件的发件人(用户类)和用户(用户类)收件人。 调用SendEmailJob时使用$details数组作为参数

然后是工作

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Mail\InfoletterMail;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Log;
use Carbon\carbon;

class SendEmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $details;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($details)
    {
        $this->details=$details;
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {  
             Log::debug('entering function handle in SendEmailJob');
             Log::debug($this->details);
            $email = new InfoletterMail($this->details);           
            Mail::to($this->details['user']->email)->send($email);              
     }  
}

我终于成功了。这有点难以解释,因此我会尽我所能澄清

事实上,电子邮件是从一个查看页面发送的,在该页面中,电子邮件在发送之前会呈现给发件人

用户有不同的按钮,一个发送给所有用户,另一个发送给限制数量的用户等

如果我打算延迟发送电子邮件,我会使用jquery脚本在用户之间循环。在每个循环中,我对控制器中的sendToOne操作执行一个ajax请求。 控制器响应ajax请求,实例化一个作业(SendMailJob),该作业本身实例化一个可邮寄(infolettmail),该邮件模板使用参数$details,该参数是一个包含“sender”索引的数组

$emailview=view('emails.infoletter')->with('details', ['title'=>$infoletter->title, 'body'=>$infoletter->body,'user'=>$fakeuser,'sender'=>auth()->user()]);
{!!html_entity_decode($emailview)!!}
如果我之前没有在视图中使用我在开始时提到的相同电子邮件模板来显示邮件预览,但忘记将“发件人”索引添加到我传递给它的$details中,那么所有这些都是正确的。 事实上,错误不是邮件本身造成的,而是预览造成的。 对于那些感兴趣的人来说,这是一个视图,其中包含创建预览的行,我忘记在其中添加“发件人”索引

$emailview=view('emails.infoletter')->with('details', ['title'=>$infoletter->title, 'body'=>$infoletter->body,'user'=>$fakeuser,'sender'=>auth()->user()]);
{!!html_entity_decode($emailview)!!}
视图代码

@extends('layouts.bare')


@section('content')

<div class="container mt-4 my-content">
    <div id='messages'>

    </div>  
 

    <div class="d-flex">
                    <a href="/infoletters" class="my-button">Retourner à la liste</a>
                    <a href="" class="my-button">Modifier</a>
                    
            
                <div>
                    {{--below a form with a submit button that will be intercepted by the java script at the bottom of page--}}   
                    {{--The script will trigger ajax requests / one per user--}}
                    {!! Form::open([]) !!}
                        <div class="row post-option-background">
                            <div class="col-md-12" >
                                {{ Form::hidden('infoletter_id', $infoletter->id) }}{{--permetra de retrouver title et body--}}
                                {{ Form::hidden('users', $users )}}{{--permetra de boucler dans jquery--}}
                            
                            </div>
                        </div>
                        {{Form::submit('Envoyer a tous',['class'=>'my-button btn  btn-submit btn-to-all','id'=>'btn-to-all'])}}

                    {!! Form::close() !!}
                </div>
                <div>
                    {{--below a form with a submit button that will be intercepted by the java script at the bottom of page--}}   
                    {{--The script will trigger ajax requests / one per user--}}
                    {!! Form::open([]) !!}
                        <div class="row post-option-background">
                            <div class="col-md-12" >
                                {{ Form::hidden('infoletter_id', $infoletter->id) }}{{--permetra de retrouver title et body--}}
                                {{ Form::hidden('users', $users )}}{{--permetra de boucler dans jquery--}}
                            
                            </div>
                        </div>
                        {{Form::submit('Envoyer au CA',['class'=>'my-button btn  btn-submit btn-to-CA','id'=>'btn-to-CA'])}}

                    {!! Form::close() !!}
                </div>
                <div>
                    {{--below a form with a submit button that will be intercepted by the java script at the bottom of page--}}   
                    {{--The script will trigger ajax requests / one per user--}}
                    {!! Form::open([]) !!}
                        <div class="row post-option-background">
                            <div class="col-md-12" >
                                {{ Form::hidden('infoletter_id', $infoletter->id) }}{{--permetra de retrouver title et body--}}
                                {{ Form::hidden('user_id',  Auth::user()->id )}}
                            
                            </div>
                        </div>
                        {{Form::submit('Envoyer à moi-même (test)',['class'=>'my-button btn  btn-submit btn-to-me','id'=>'btn-to-me'])}}

                    {!! Form::close() !!}
                </div>  

    </div>

</div>  
                
<div class="container mt-4 my-content"> 
    
    

    <div class="my-post-body">
        {!!html_entity_decode($emailview)!!}
        
    </div>      
</div>  

<script type="text/javascript">
    $( document ).ready(function() {
        //$('#messages').append('<h1> Le java scirpt fonctionne</h1>');
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
                
            }
        });

        $('#btn-to-all').click(function(e){ 
            e.preventDefault();
            var infoletter_id = $("input[name=infoletter_id]").val();
            var users = $("input[name=users]").val();
            parsed_users=JSON.parse(users);
            var i=0;
            var url='{{ url('infoletters/sendToOne') }}';
            delay=0;
            for (i=0; i<parsed_users.length;i++){
                $.ajax({
                    type:'POST',
                    url:url,
                    data:{user_id:parsed_users[i].id,infoletter_id:infoletter_id,delay:delay},
                    dataType: 'json',
                    success:function(data){
                        $('#messages').prepend('<div class="comments-message" style="margin-bottom:15px;padding:5px;background-color: green; color: white; margin-top:5px;">'+data['success']+'!.</div>');
                    }
                });
                delay=delay+3;
            }   
        });
        $('#btn-to-CA').click(function(e){  
            e.preventDefault();
            var CAMembers=[23,1,4,12,55,19,7,17,18,10,25,5,24];
            var infoletter_id = $("input[name=infoletter_id]").val();
            var users = $("input[name=users]").val();
            parsed_users=JSON.parse(users);
            var i=0;
            var url='{{ url('infoletters/sendToOne') }}';
            delay=0;
            for (i=0; i<parsed_users.length;i++){
                if(CAMembers.includes(parsed_users[i].id)){
                    $.ajax({
                        type:'POST',
                        url:url,
                        data:{user_id:parsed_users[i].id,infoletter_id:infoletter_id,delay:delay},
                        dataType: 'json',
                        success:function(data){
                            $('#messages').prepend('<div class="comments-message" style="margin-bottom:15px;padding:5px;background-color: green; color: white; margin-top:5px;">'+data['success']+'!.</div>');
                        }
                    });
                delay=delay+3;

                }
            }   
        });

        $('#btn-to-me').click(function(e){  
            $('#messages').prepend('<div class="comments-message" style="margin-bottom:15px;padding:5px;background-color: green; color: white; margin-top:5px;">Le script fonctionne.</div>');
            e.preventDefault();
            var infoletter_id = $("input[name=infoletter_id]").val();
            var user_id = $("input[name=user_id]").val();
            var url='{{ url('infoletters/sendToOne') }}';
            $.ajax({
                    type:'POST',
                    url:url,
                    data:{user_id:user_id,infoletter_id:infoletter_id},
                    dataType: 'json',
                    success:function(data){
                        $('#messages').prepend('<div class="comments-message" style="margin-bottom:15px;padding:5px;background-color: green; color: white; margin-top:5px;">'+data['success']+'!.</div>');
                    }
                });
                
        });

        
    });
    </script>
@endsection

我终于成功了。这有点难以解释,因此我会尽我所能澄清

事实上,电子邮件是从一个查看页面发送的,在该页面中,电子邮件在发送之前会呈现给发件人

用户有不同的按钮,一个发送给所有用户,另一个发送给限制数量的用户等

如果我打算延迟发送电子邮件,我会使用jquery脚本在用户之间循环。在每个循环中,我对控制器中的sendToOne操作执行一个ajax请求。 控制器响应ajax请求,实例化一个作业(SendMailJob),该作业本身实例化一个可邮寄(infolettmail),该邮件模板使用参数$details,该参数是一个包含“sender”索引的数组

$emailview=view('emails.infoletter')->with('details', ['title'=>$infoletter->title, 'body'=>$infoletter->body,'user'=>$fakeuser,'sender'=>auth()->user()]);
{!!html_entity_decode($emailview)!!}
如果我之前没有在视图中使用我在开始时提到的相同电子邮件模板来显示邮件预览,但忘记将“发件人”索引添加到我传递给它的$details中,那么所有这些都是正确的。 事实上,错误不是邮件本身造成的,而是预览造成的。 对于那些感兴趣的人来说,这是一个视图,其中包含创建预览的行,我忘记在其中添加“发件人”索引

$emailview=view('emails.infoletter')->with('details', ['title'=>$infoletter->title, 'body'=>$infoletter->body,'user'=>$fakeuser,'sender'=>auth()->user()]);
{!!html_entity_decode($emailview)!!}
视图代码

@extends('layouts.bare')


@section('content')

<div class="container mt-4 my-content">
    <div id='messages'>

    </div>  
 

    <div class="d-flex">
                    <a href="/infoletters" class="my-button">Retourner à la liste</a>
                    <a href="" class="my-button">Modifier</a>
                    
            
                <div>
                    {{--below a form with a submit button that will be intercepted by the java script at the bottom of page--}}   
                    {{--The script will trigger ajax requests / one per user--}}
                    {!! Form::open([]) !!}
                        <div class="row post-option-background">
                            <div class="col-md-12" >
                                {{ Form::hidden('infoletter_id', $infoletter->id) }}{{--permetra de retrouver title et body--}}
                                {{ Form::hidden('users', $users )}}{{--permetra de boucler dans jquery--}}
                            
                            </div>
                        </div>
                        {{Form::submit('Envoyer a tous',['class'=>'my-button btn  btn-submit btn-to-all','id'=>'btn-to-all'])}}

                    {!! Form::close() !!}
                </div>
                <div>
                    {{--below a form with a submit button that will be intercepted by the java script at the bottom of page--}}   
                    {{--The script will trigger ajax requests / one per user--}}
                    {!! Form::open([]) !!}
                        <div class="row post-option-background">
                            <div class="col-md-12" >
                                {{ Form::hidden('infoletter_id', $infoletter->id) }}{{--permetra de retrouver title et body--}}
                                {{ Form::hidden('users', $users )}}{{--permetra de boucler dans jquery--}}
                            
                            </div>
                        </div>
                        {{Form::submit('Envoyer au CA',['class'=>'my-button btn  btn-submit btn-to-CA','id'=>'btn-to-CA'])}}

                    {!! Form::close() !!}
                </div>
                <div>
                    {{--below a form with a submit button that will be intercepted by the java script at the bottom of page--}}   
                    {{--The script will trigger ajax requests / one per user--}}
                    {!! Form::open([]) !!}
                        <div class="row post-option-background">
                            <div class="col-md-12" >
                                {{ Form::hidden('infoletter_id', $infoletter->id) }}{{--permetra de retrouver title et body--}}
                                {{ Form::hidden('user_id',  Auth::user()->id )}}
                            
                            </div>
                        </div>
                        {{Form::submit('Envoyer à moi-même (test)',['class'=>'my-button btn  btn-submit btn-to-me','id'=>'btn-to-me'])}}

                    {!! Form::close() !!}
                </div>  

    </div>

</div>  
                
<div class="container mt-4 my-content"> 
    
    

    <div class="my-post-body">
        {!!html_entity_decode($emailview)!!}
        
    </div>      
</div>  

<script type="text/javascript">
    $( document ).ready(function() {
        //$('#messages').append('<h1> Le java scirpt fonctionne</h1>');
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
                
            }
        });

        $('#btn-to-all').click(function(e){ 
            e.preventDefault();
            var infoletter_id = $("input[name=infoletter_id]").val();
            var users = $("input[name=users]").val();
            parsed_users=JSON.parse(users);
            var i=0;
            var url='{{ url('infoletters/sendToOne') }}';
            delay=0;
            for (i=0; i<parsed_users.length;i++){
                $.ajax({
                    type:'POST',
                    url:url,
                    data:{user_id:parsed_users[i].id,infoletter_id:infoletter_id,delay:delay},
                    dataType: 'json',
                    success:function(data){
                        $('#messages').prepend('<div class="comments-message" style="margin-bottom:15px;padding:5px;background-color: green; color: white; margin-top:5px;">'+data['success']+'!.</div>');
                    }
                });
                delay=delay+3;
            }   
        });
        $('#btn-to-CA').click(function(e){  
            e.preventDefault();
            var CAMembers=[23,1,4,12,55,19,7,17,18,10,25,5,24];
            var infoletter_id = $("input[name=infoletter_id]").val();
            var users = $("input[name=users]").val();
            parsed_users=JSON.parse(users);
            var i=0;
            var url='{{ url('infoletters/sendToOne') }}';
            delay=0;
            for (i=0; i<parsed_users.length;i++){
                if(CAMembers.includes(parsed_users[i].id)){
                    $.ajax({
                        type:'POST',
                        url:url,
                        data:{user_id:parsed_users[i].id,infoletter_id:infoletter_id,delay:delay},
                        dataType: 'json',
                        success:function(data){
                            $('#messages').prepend('<div class="comments-message" style="margin-bottom:15px;padding:5px;background-color: green; color: white; margin-top:5px;">'+data['success']+'!.</div>');
                        }
                    });
                delay=delay+3;

                }
            }   
        });

        $('#btn-to-me').click(function(e){  
            $('#messages').prepend('<div class="comments-message" style="margin-bottom:15px;padding:5px;background-color: green; color: white; margin-top:5px;">Le script fonctionne.</div>');
            e.preventDefault();
            var infoletter_id = $("input[name=infoletter_id]").val();
            var user_id = $("input[name=user_id]").val();
            var url='{{ url('infoletters/sendToOne') }}';
            $.ajax({
                    type:'POST',
                    url:url,
                    data:{user_id:user_id,infoletter_id:infoletter_id},
                    dataType: 'json',
                    success:function(data){
                        $('#messages').prepend('<div class="comments-message" style="margin-bottom:15px;padding:5px;background-color: green; color: white; margin-top:5px;">'+data['success']+'!.</div>');
                    }
                });
                
        });

        
    });
    </script>
@endsection

你能告诉我($sender);进入sendToOne函数。我认为这个变量是空的。在整个过程中,只要我不在电子邮件模板中使用牵连索引,日志就会显示发件人在这里并且是正确的(firstname、familyname等),因此$sender不是空的。我在ajax请求中使用dd时遇到问题。嗯,好的,在日志调试中,您每次都有“发送者”索引吗?你可以php artisan缓存:清除吗?我这样做了,但问题仍然存在扫描你dd($sender);进入sendToOne函数。我认为这个变量是空的。在整个过程中,只要我不在电子邮件模板中使用牵连索引,日志就会显示发件人在这里并且是正确的(firstname、familyname等),因此$sender不是空的。我在ajax请求中使用dd时遇到问题。嗯,好的,在日志调试中,您每次都有“发送者”索引吗?你能把php artisan缓存清除吗?我这样做了,但问题仍然存在