codewiser/postie
Composer 安装命令:
composer require codewiser/postie
包简介
Subscription management Laravel package
README 文档
README
Postie is a dashboard where users can manage their subscription preferences.
Every Notification in application has corresponding audience. It doesn't mean, that everyone from audience will receive a notification, but it is possible. So, Postie allows user to decide what channels he or she wants to be used to deliver notification.
Installation
Install Postie into your project using the Composer package manager:
composer require codewiser/postie
After installing Postie, publish its assets using the postie:install Artisan command:
php artisan postie:install
Before running migrations you may want to change name of the table, that keeps user subscription preferences. Then see config/postie.php.
'table' => env('POSTIE_TABLE', 'subscriptions'),
After you configured table name run migrations:
php artisan migrate
Configuration
After installing Postie, its service provider will be located at App\Proviers\PostieServiceProvider.
First, provide information about every Notification, that users may manage. Every subscription requires list of available channels and possible audience (as builder).
use Codewiser\Postie\Subscription; use Codewiser\Postie\PostieApplicationServiceProvider; class PostieServiceProvider extends PostieApplicationServiceProvider { public function notifications(): array { return [ Subscription::to(NewOrderNotification::class) ->via('mail', 'database') ->for(fn() => User::query()->where('role', 'sales-manager')) ]; }
Second, replace Notification::via() method with \Codewiser\Postie\Notifications\Traits\Channelization trait. Notification will use list of channels defined in associated Subscription.
namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Notification; use Codewiser\Postie\Notifications\Traits\Channelization; class NewOrderNotification extends Notification implements ShouldQueue { use Queueable, Channelization; public function __construct(public Order $order) { // } public function toMail($notifiable) { return (new MailMessage) ->subject("New order") ->line('User makes new order.'); } public function toArray($notifiable) { return $this->order->toArray(); } }
Subscription Definition
Subscription is an object, that helps you describe application notification for Postie to understand.
Initially, it is enough to pass notification class name, query builder with users, who may receive such notification and channels list, supported by notification.
use Codewiser\Postie\Subscription; Subscription::to(Notification::class) ->via('mail') ->for(fn() => User::query())
Moreover, you may define notification title and description.
use Codewiser\Postie\Subscription; Subscription::to(DailyNewsNotification::class) ->via('mail') ->for(fn() => User::query()) ->title('Daily News Notification') ->description('Sends most interesting news digest')
Channel Definition
When you set up Subscription, you may pass channel as a simple string. But there are a way to define more complex channel representation.
You may use \Codewiser\Postie\Channel object to describe channel with custom title, icon etc.:
use Codewiser\Postie\Channel; use Codewiser\Postie\Subscription; $mail = Channel::via('mail') ->icon('envelope') ->title('via email') ->subtitle('Sends emails'); Subscription::to(DailyNewsNotification::class) ->via($mail);
You may define default state of channel. If channel is active, then all users will receive notifications through this channel until they unsubscribe. Vice versa, if channel is passive, all users will not receive notifications via this channel until they subscribe to it.
Default channel state is active.
use Codewiser\Postie\Channel; $mail = Channel::via('mail')->passive();
If you want to disable user ability to manage channel preferences, you may hide channel form user interface, or just force channel state.
use Codewiser\Postie\Channel; $mail = Channel::via('database')->hidden();
use Codewiser\Postie\Channel; $mail = Channel::via('mail')->active()->forced();
Grouping Subscriptions
You may group subscriptions to create side menu for dashboard. Subscriptions inherit channels and audience form a group, if defined.
use Codewiser\Postie\Group; use Codewiser\Postie\Subscription; Group::make('My group') ->icon('broadcast') ->via('mail', 'database') ->for(fn() => User::query()) ->add(Subscription::to(DailyNewsNotification::class) ->add(Subscription::to(NewOrderNotification::class)
Previewing Notifications
You may define notification preview. So user can see how notification will be looks like.
Notification preview may be composed with model factories...
use Codewiser\Postie\Subscription; Subscription::to(DailyNewsNotification::class) ->via('email') ->for(fn() => User::query()) ->preview(function(string $channel, $notifiable) { $news = NewsItem::factory()->count(3)->make(); $notification = new DailyNewsNotification($news); return match ($channel) { 'mail' => $notification->toMail($notifiable), 'telegram' => $notification->toTelegram($notifiable), 'database', 'broadcast' => $notification->toArray($notifiable), }; });
Sending Notifications
Using Postie, you may simply send notification without defining notifiables, as Postie already knows subscribers.
use Codewiser\Postie\Contracts\Postie; class OrderController extends Controller { public function store(OrderStoreRequest $request, Postie $postie) { $order = Order::create($request->validated()); $postie->send(new NewOrderNotification($order)); } }
If you need to limit notifiables, you may use a callback:
use Codewiser\Postie\Contracts\Postie; class OrderController extends Controller { public function store(OrderStoreRequest $request, Postie $postie) { $order = Order::create($request->validated()); $postie->send(new NewOrderNotification($order), function($builder) use ($order) { if ($order->amount > 10) { return $builder->where('level', 'vip'); } else { return $builder->whereNull('level'); } }); } }
You still may send notifications using Facade or notify() method. As Notification uses Channelization trait, it will respect user preferences.
$user->notify(new NewOrderNotification($order));
codewiser/postie 适用场景与选型建议
codewiser/postie 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.17k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2022 年 05 月 25 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「notifications」 「subscription」 「laravel」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 codewiser/postie 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 codewiser/postie 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 codewiser/postie 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A Laravel Nova package that adds a notification feed in your Nova app.
MaxAl Subscriptions is a flexible plans and subscription management system for Laravel, with the required tools to run your SAAS like services efficiently. It's simple architecture, accompanied by powerful underlying to afford solid platform for your business.
Rinvex Subscriptions is a flexible plans and subscription management system for Laravel, with the required tools to run your SAAS like services efficiently. It's simple architecture, accompanied by powerful underlying to afford solid platform for your business.
Rinvex Subscriptions is a flexible plans and subscription management system for Laravel, with the required tools to run your SAAS like services efficiently. It's simple architecture, accompanied by powerful underlying to afford solid platform for your business.
Rinvex Subscriptions is a flexible plans and subscription management system for Laravel, with the required tools to run your SAAS like services efficiently. It's simple architecture, accompanied by powerful underlying to afford solid platform for your business.
Captures outgoing SMS notifications
统计信息
- 总下载量: 1.17k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 3
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2022-05-25
