Laravel 8: 在字符串上调用成员函数notify()

Laravel 8: Call to a member function notify() on string

我正在与 Laravel 8 合作创建一个论坛,现在我想向提出问题的用户发送通知,只要有人回答了该问题。

因此,为了做到这一点,我将其添加到控制器中:

public function postAnswer(Request $request, $question, $asker) {
        $validate_data = $request->validate([
            'answer' => 'required',
        ]);

        $answer = Answer::create([
            'answer' => $request->answer,
            'user_id' => auth()->user()->id,
            'question_id' => $question,
        ]);

        $asker->notify(new RepliedToThread($question));

        return back();
    }

所以 $question问题 ID$asker用户 ID已提问。

但现在我得到这个错误:

在字符串上调用成员函数 notify()

现在有趣的是,当我使用 auth()->user()->notify(new RepliedToThread($question)); 时,它工作正常!

但我不想通知任何经过身份验证的用户,我需要通知提出问题的人,这就是我尝试传递 $asker...

的原因

所以如果你知道如何解决这个问题,请告诉我...

非常感谢你们的任何想法或建议。

提前致谢。

Blade:

<form action="{{ route('questions.answers', ['question' => $show->id, 'asker' => $show->user->id]) }}" method="POST" enctype="multipart/form-data">
    @csrf
    <div class="mb-4">
        <textarea name="answer" id="answer" class="form-control BSinaBold" rows="7" placeholder="Write down answer"></textarea>
        @error('answer')
            <div class="text-red-500 mt-2 text-sm">
                {{ $message }}
            </div>
        @enderror
    </div>
    </br>
    <button type="submit" class="btn btn-primary">Send</button>
</form>

根据您所说,问题是$asker。此参数应该是来自 User 模型的实例,但错误表明它是字符串。

在您的表单中更改表单标签:

<form action="{{ route('questions.answers', ['question' => $show->id, 'asker' => $show->user]) }}" method="POST" enctype="multipart/form-data">

去掉user后的id

问题是 asker 只是一个 id,你应该从用户 table 那里获取 asker 的其他信息,然后将你的通知传递给 asker.

$asker = User::findOrFail($asker);
$asker->notify(new RepliedToThread($question));

确保您的 Answer.phpuse Notifiable; 导入

ref link https://laravel.com/docs/8.x/notifications#using-the-notifiable-trait

那么只有您可以从 Answer 模型实例

调用 notify() 函数

问题是 $asker 只是一个字符串,它只是用户的 id 值。 我建议你使用 laravels 路由模型绑定。传递的参数 $querstion$asker 会自动从数据库中查询。 https://laravel.com/docs/8.x/routing#route-model-binding

之后您可以正常访问问题ID,并且您拥有可通知的用户模型。

public function postAnswer(Request $request, Question $question, User $asker) {
   $validate_data = $request->validate([
            'answer' => 'required',
        ]);

        $answer = Answer::create([
            'answer' => $request->answer,
            'user_id' => auth()->user()->id,
            'question_id' => $question->id,
        ]);

        $asker = User::find($asker);
        $asker->notify(new RepliedToThread($question));

        return back();
}