Я хочу обработать генерацию исключения из fcm, если токен устройства больше не действителен

Я сталкиваюсь с проблемой, что если устройство больше не существует, ответ fcm, содержащий такую ​​ошибку

{
    "message": "Client error: `POST https://fcm.googleapis.com/v1/projects/internationalfriendspusher/messages:send'resulted in a `404 Not Found` response:\n{\n  \"error\": {\n    \"code\": 
404,\n    \"message\": \"Requested entity was not found.\",\n    \"status\": 
\"NOT_FOUND\",\n    \"detail (truncated...)\n",
    "exception": "Kreait\\Firebase\\Exception\\Messaging\\NotFound",
    "file": "/var/www/vhosts/lvps87-230-85- 
   233.dedicated.hosteurope.de/pusherang/MainApp/vendor/kreait/firebase- 
   php/src/Firebase/Exception/MessagingException.php"
}

Я действительно отправляю массовое уведомление с идентификаторами устройств внутри массива и перебираю его, когда какой-либо идентификатор устройства для соответствующего токена больше не существует, это нарушает мой код, поэтому я хочу обработать это и перейти к следующему идентификатору устройства

мои данные запроса

{
    "message": {
    "content":"My Test notification",
    "content_available":"zXCzCzDXs",
    "message_url":"www.example.com",
    "priority":"dfgdfgfd",
    "title":"Test"
    },
    "device_ids":[
    "4706277e9565496",
    "f02f1f4558206539"
    ]
}

код

foreach($input['device_ids'] as $deviceId)
{
    $pusher = Push::where('device_id' , $deviceId )
                       ->where('push_enable' , 'true')
                       ->first();
    if ($pusher)
    {
         if (strtolower($pusher->push_enable)  == "true")
         {
             $deviceToken = $pusher->registration_id;

             $message = CloudMessage::withTarget('token', $deviceToken);

             $title = $input['message']['title'];
             $body = $input['message']['content'];

             $notification = Notification::fromArray([
                   'title' => $title,
                   'body' => $body
             ]);

             $message = $message->withNotification($notification);

             try 
             {
                 // Here notification send to device and here my code breaks if device token not validate or user install app
                 $this->messaging->send($message));     
                 $device = new Device;
                 $device->deviceId = $deviceId;
                 $device->title = $title;
                 $device->content = $body;
                 $device->message_url = $input['message']['message_url'];
                 $device->priority = $input['message']['priority'];
                 $device->content_available = $input['message']['content_available'];
                 $status = $device->save();
                 if ($status)
                 {
                    continue;
                 }                                    
            }
            catch(Exception $e) 
           {
              echo "Permission denied for Device: ".$deviceId." having token ".$deviceToken." from Firebase";
                                  continue;
           }
      }
      else
      {
        continue;
      }                                
  }
  else
  {
     echo "Device having id ".$deviceId." were not found";
     continue;
  }
}

Загляните в try / catch. php.net/manual/en/language.exceptions.phplaravel.com/docs/5.7/errors

ceejayoz 24.09.2018 15:09

мой метод отправки уже внутри пытается поймать блок, это не решение

Syed Nazir Hussain 24.09.2018 15:14

Конечно да. Вы можете без проблем поместить попытку / уловку в другую попытку / уловить. Оберните каждый send в один, и вы можете регистрировать сбои и продолжать работу.

ceejayoz 24.09.2018 15:17

Я также предоставляю свой код. так вы можете определить, где я поставил блок try catch

Syed Nazir Hussain 24.09.2018 15:28

Готов поспорить, ваша проблема связана с пространством имен catch(Exception $e) - вероятно, он улавливает только что-то вроде App\Http\Controllers\YourController\Exception (которого не существует). Попробуйте catch(\Exception $e) - обратите внимание на начало \ - или поместите use Exception; в начало файла.

ceejayoz 24.09.2018 15:29

Да, вы правы, вы решили проблему

Syed Nazir Hussain 24.09.2018 15:35

Круто, я добавил ответ, отражающий это.

ceejayoz 24.09.2018 15:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
3
7
1 907
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы были почти у цели - это проблема с пространством имен.

catch(Exception $e) в файле с пространством имен (то есть namespace App\Foo\Bar вверху файла) мало что улавливает - он тоже с пространством имен, так что вы поймаете только App\Foo\Bar\Exception.

Если указать псевдоним use Exception в верхней части файла, PHP будет использовать исключение корень, а не пространство имен.

В качестве альтернативы catch(\Exception $e) с начальным символом \ будет делать то же самое.

Боковое примечание: вы можете поймать исключения специфический таким же образом, то есть:

catch(\Kreait\Firebase\Exception\Messaging\NotFound $e)

Другие вопросы по теме