在開發一個需要實時通知用戶的應用時,我遇到了一個問題:如何在不打擾用戶的前提下,及時將重要信息推送給他們?經過一番研究和嘗試,我發現使用 laravel 結合 web 推送通知是一個理想的解決方案。然而,實現這一功能并不簡單,直到我找到了 laravel-notification-channels/webpush 這個包,它通過 composer 輕松地解決了我的困擾。
首先,我通過 Composer 安裝了這個包:
composer require laravel-notification-channels/webpush
安裝后,我按照文檔的指引,對我的 User 模型進行了修改,添加了 HasPushSubscriptions trait:
use NotificationChannelsWebPushHasPushSubscriptions; class User extends Model { use HasPushSubscriptions; }
接著,我發布了遷移文件和配置文件,并運行了遷移命令來創建必要的表:
php artisan vendor:publish --provider="NotificationChannelsWebPushWebPushServiceProvider" --tag="migrations" php artisan migrate php artisan vendor:publish --provider="NotificationChannelsWebPushWebPushServiceProvider" --tag="config"
為了確保瀏覽器能夠正確認證,我生成了 VAPID 密鑰:
php artisan webpush:vapid
這個命令會在 .env 文件中設置 VAPID_PUBLIC_KEY 和 VAPID_PRIVATE_KEY,這些密鑰對于使用 Push API 是必需的。需要注意的是,如果你的應用面向 safari 或 ios 2023 年后的版本,還需要設置 VAPID_SUBJECT 變量,否則會收到 BadJwtToken 錯誤。
接下來,我在通知類中使用了 WebPushChannel 發送推送通知:
use IlluminateNotificationsNotification; use NotificationChannelsWebPushWebPushMessage; use NotificationChannelsWebPushWebPushChannel; class AccountApproved extends Notification { public function via($notifiable) { return [WebPushChannel::class]; } public function toWebPush($notifiable, $notification) { return (new WebPushMessage) ->title('Approved!') ->icon('/approved-icon.png') ->body('Your account was approved!') ->action('View account', 'view_account') ->options(['TTL' => 1000]); } }
為了管理用戶的推送訂閱,我使用了 updatePushSubscription 和 deletePushSubscription 方法:
$user = AppUser::find(1); $user->updatePushSubscription($endpoint, $key, $token, $contentEncoding); $user->deletePushSubscription($endpoint);
通過這些步驟,我成功地實現了 Web 推送通知的功能。使用 Composer 安裝 laravel-notification-channels/webpush 包不僅簡化了整個過程,還確保了代碼的可維護性和可擴展性。它的優勢在于:
- 易于集成:通過 Composer 安裝,快速上手。
- 高效管理:提供了簡單的方法來管理用戶的推送訂閱。
- 跨瀏覽器兼容:支持多種瀏覽器,確保用戶體驗的一致性。
總的來說,使用 Composer 和 laravel-notification-channels/webpush 包讓我在 Laravel 項目中輕松實現了 Web 推送通知的功能,大大提升了用戶體驗和應用的實時性。