传递给 App\Events\NoticeAnnouncement::__construct() 的参数 3 必须是 App\User 的实例

Posted

技术标签:

【中文标题】传递给 App\\Events\\NoticeAnnouncement::__construct() 的参数 3 必须是 App\\User 的实例【英文标题】:Argument 3 passed to App\Events\NoticeAnnouncement::__construct() must be an instance of App\User传递给 App\Events\NoticeAnnouncement::__construct() 的参数 3 必须是 App\User 的实例 【发布时间】:2021-05-16 02:39:14 【问题描述】:

我正在尝试在老师发布通知时向所有学生发送邮件。为此,我在创建通知时调用了一个事件,并通过事件变量传递了通知、教师和用户。但它给出一个错误,说“传递给 App\Events\NoticeAnnouncement::__construct() 的参数 3 必须是 App\User 的实例,给定的 Illuminate\Database\Eloquent\Collection 的实例,在 C:\xampp\htdocs 中调用\iiucsmartclas-s-room\app\Http\Controllers\Teacher\NoticeController.php”。

这是我的通知控制器:

 public function submitNotice(Request $request)
    $validatedData = $request->validate([
    'notice_title' => 'required|max:255',
    'notice_description' => 'required|max:3000',
    'notice_file.*' => 'mimes:jpg,jpeg,pdf',
    ]);

    $data=array();
    $data['teacher_id']=$request->teacher_id;
    $data['notice_title']=$request->notice_title;
    $data['notice_description']=$request->notice_description;
    $data['notice_post_date']=$request->notice_post_date;
    $data['notice_post_time']=$request->notice_post_time;
    $image=$request->file('notice_file');

    if ($image) 
        $image_name= str::random(5);
        $ext=strtolower($image->getClientOriginalExtension());
        $image_full_name=$image_name.'.'.$ext;
        $upload_path='notices/';
        $image_url=$upload_path.$image_full_name;
        $success=$image->move($upload_path,$image_full_name);
        if ($success) 
            $data['notice_file']=$image_url;
            $notices = DB::table('notices')
                     ->insertGetId($data);

             $notice = Notice::find($notices);
             $teacher = Teacher::find($notice->teacher_id);
             $users = User::all();

             event(new NoticeAnnouncement($notice,$teacher,$users));
          if ($notices) 
             $notification=array(
             'message'=>'Notice Posted Successfully',
             'alert-type'=>'success'
              );
            return Redirect()->back()->with($notification);                      
         else
          $notification=array(
             'message'=>'Could not be able to post the Notice',
             'alert-type'=>'error'
              );
             return Redirect()->back()->with($notification);
               
            
        else

          return Redirect()->back();
            
        
    else
          $notice = DB::table('notices')
                     ->insert($data);
          if ($notice) 
             $notification=array(
             'message'=>'Notice Posted Successfully',
             'alert-type'=>'success'
              );
            return Redirect()->back()->with($notification);                     
         else
          $notification=array(
             'message'=>'Could not be able to post the Notice',
             'alert-type'=>'error'
              );
             return Redirect()->back()->with($notification);
           
    

这是我的活动:

public $notice,$teacher,$user;
/**
 * Create a new event instance.
 *
 * @return void
 */
public function __construct(Notice $notice,Teacher $teacher,User $user)

    $this->notice = $notice;
    $this->teacher = $teacher; 
    $this->user = $user;

这是我的听众:

public function handle(NoticeAnnouncement $event)

        foreach ($event->user as $user) 
        Mail::to($user->email)->send(new SendNotice($event->notice,$event->teacher,$event->user));
    

【问题讨论】:

您的方法需要一个用户。您正在使用一组用户来调用它。 我需要向所有用户发送邮件,我必须为此调用用户集合。有什么办法可以解决吗? 【参考方案1】:

您将用户集合发送到方法而不是用户模型:

Mail::to($user->email)->send(new SendNotice($event->notice,$event->teacher,$user));

【讨论】:

还是不行 同样的错误? $event->user 集合中的模型属于 App\User? 是的,同样的错误。是的 App\User 类型。 我会通过转储 $user 来检查,如果 $user 的类型是 App\User,它不会从这行代码中抛出该错误...【参考方案2】:

您使用find($key) 函数从\Illuminate\Database\Eloquent\Collection 获取Illuminate\Database\Eloquent\Model

public function handle(NoticeAnnouncement $event)

        foreach ($event->users as $key => $user) 
        Mail::to($user->email)->send(new SendNotice($event->notice,$event->teacher,$event->users->find($key)));
    

【讨论】:

以上是关于传递给 App\Events\NoticeAnnouncement::__construct() 的参数 3 必须是 App\User 的实例的主要内容,如果未能解决你的问题,请参考以下文章

无法正确地将值从父母传递给孩子和孩子传递给父母

如何将对象数组作为道具传递给组件,然后将数组的成员作为道具传递给嵌套组件?

为啥将 ClientID 传递给 javascript 函数会传递整个控件?

将变量传递给 jQuery 插件参数

如何将环境变量传递给传递给xmllint的命令?

将 JSON 数据从 php 传递给 html-data 属性,然后传递给 Javascript