Я создаю API с помощью Laravel и хочу отправить push-уведомление с помощью системы уведомлений Laravel. У меня есть модель для матчей (которая в основном является постом), этот матч может понравиться другому пользователю. Когда матч понравился, создатель поста получит push-уведомление. Это как Instagram, Facebook и т. Д.
Часто push-уведомление не отправлялось пользователю. Я установил Laravel Horizon, чтобы увидеть, есть ли там ошибки. Иногда уведомление отправлялось, а иногда нет. С точно такими же данными:
Иногда происходит сбой уведомления с точно такими же данными (тот же пользователь, то же совпадение).
Ошибка заключается в следующем:
Осветить \ База данных \ Eloquent \ ModelNotFoundException: нет результатов запроса
для модели [App \ Models \ Match] 118 в
/home/forge/owowgolf.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:312
Я уверен, что совпадение и пользователь существуют в базе данных, я проверял это перед отправкой уведомления. Кто-нибудь знает, что идет не так? Все, что я смог найти в Интернете, — это то, что люди не сохранили свою модель до отправки уведомления в очередь. Но строка, куда код отправляет уведомление в очередь, даже не будет достигнута, если модель не существует. Из-за неявного связывания в маршруте / контроллере.
Контроллер метод:
/**
* Like a match.
*
* @param \App\Models\Match $match
* @return \Illuminate\Http\JsonResponse
*/
public function show(Match $match)
{
$match->like();
$players = $match->players()->where('user_id', '!=', currentUser()->id)->get();
foreach ($players as $user) {
$user->notify(new NewLikeOnPost($match, currentUser()));
}
return ok();
}
Уведомление:
<?php
namespace App\Notifications;
use App\Models\Match;
use App\Models\User;
use Illuminate\Bus\Queueable;
use NotificationChannels\Apn\ApnChannel;
use NotificationChannels\Apn\ApnMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
class NewLikeOnPost extends Notification implements ShouldQueue
{
use Queueable;
/**
* The match instance.
*
* @var \App\Models\Match
*/
private $match;
/**
* The user instance.
*
* @var \App\Models\User
*/
private $user;
/**
* Create a new notification instance.
*
* @param \App\Models\Match $match
* @param \App\Models\User $user
*/
public function __construct(Match $match, User $user)
{
$this->user = $user;
$this->match = $match;
$this->onQueue('high');
}
/**
* Get the notification's delivery channels.
*
* @param \App\Models\User $notifiable
* @return array
*/
public function via($notifiable)
{
if ($notifiable->wantsPushNotification($this)) {
return ['database', ApnChannel::class];
}
return ['database'];
}
/**
* Get the mail representation of the notification.
*
* @param \App\Models\User $notifiable
* @return \NotificationChannels\Apn\ApnMessage
*/
public function toApn($notifiable)
{
return ApnMessage::create()
->badge($notifiable->unreadNotifications()->count())
->sound('success')
->body($this->user->username . ' flagged your match.');
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
'user_id' => $this->user->id,
'body' => "<flag>Flagged</flag> your match.",
'link' => route('matches.show', $this->match),
'match_id' => $this->match->id,
];
}
/**
* Get the match attribute.
*
* @return \App\Models\Match
*/
public function getMatch()
{
return $this->match;
}
}
Проверьте ваш .env, чтобы убедиться, что вы действительно используете REDIS
BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
SESSION_LIFETIME=120
QUEUE_DRIVER=redis
тогда очисти кеш ( php artisan cache:clear , php artisan view:clear
), это должно прояснить проблему
У меня были подобные проблемы, но теперь я использую только Docker, и прежде чем мне пришлось проверять наличие кэшированных конфигурационных файлов, неправильных разрешений файлов / папок и т. Д. (REDIS только для широковещательной передачи, другие были стандартными). Я начал использовать только redis — это намного проще, быстрее и удобнее для отладки! И вместе с Docker действительно полезно не использовать испорченный nginx / apache / php / redis / …
Других решений пока нет …