joepages/laravel-emails
Composer 安装命令:
composer require joepages/laravel-emails
包简介
Polymorphic emails package for Laravel - Attach N emails to any model
README 文档
README
Polymorphic email addresses for Laravel. Attach multiple email addresses to any Eloquent model with full CRUD, bulk sync, primary management, verification tracking, and multi-tenancy awareness.
Requirements
- PHP 8.2+
- Laravel 11 or 12
Installation
composer require joepages/laravel-emails
Run the install command to publish the config and migrations:
php artisan emails:install php artisan migrate
The installer auto-detects stancl/tenancy and publishes migrations to database/migrations/tenant/ when present.
Install options
php artisan emails:install --force # Overwrite existing files php artisan emails:install --skip-migrations # Only publish config
Quick Start
1. Add the trait to your model
use Emails\Concerns\HasEmails; class Facility extends Model { use HasEmails; }
2. Add the controller trait
use Emails\Concerns\ManagesEmails; class FacilityController extends BaseApiController { use ManagesEmails; }
3. Register routes
Route::emailRoutes('facilities', FacilityController::class);
This registers the following routes:
| Method | URI | Action |
|---|---|---|
| GET | /facilities/{facility}/emails |
listEmails |
| POST | /facilities/{facility}/emails |
storeEmail |
| PUT | /facilities/{facility}/emails/{email} |
updateEmail |
| DELETE | /facilities/{facility}/emails/{email} |
deleteEmail |
Model Trait API
The HasEmails trait provides three relationships on your model:
$facility->emails; // All emails (MorphMany) $facility->primaryEmail; // Primary email (MorphOne) $facility->emailsOfType('work'); // Filtered by type (MorphMany)
Email Model
Fields
| Field | Type | Description |
|---|---|---|
type |
string | Email type (personal, work, billing, other) |
is_primary |
boolean | Whether this is the primary email |
email |
string | The email address |
is_verified |
boolean | Whether the email has been verified |
verified_at |
datetime|null | When the email was verified |
metadata |
array|null | Custom JSON data |
Scopes
Email::primary()->get(); // Only primary emails Email::ofType('work')->get(); // Filter by type Email::forModel($facility)->get(); // All emails for a specific model Email::verified()->get(); // Only verified emails
Helpers
$email->markAsPrimary(); // Sets as primary, unsets all others for the same parent $email->markAsVerified(); // Sets is_verified=true and verified_at=now $email->domain; // "example.com" (domain part of the address)
Controller Trait
The ManagesEmails trait provides two integration modes:
Standalone CRUD
Use the storeEmail, updateEmail, deleteEmail, and listEmails methods directly via the route macro.
Bulk Sync via BaseApiController
When your controller extends BaseApiController, the attachEmail() method is called automatically during store() and update(). Send an emails array in the request body:
{
"name": "Main Facility",
"emails": [
{
"id": 1,
"email": "updated@example.com"
},
{
"email": "billing@example.com",
"type": "billing",
"is_primary": true
}
]
}
- Records with an
idare updated - Records without an
idare created - Existing records not included in the array are deleted
API Resource
Add emails to your JSON responses:
use Emails\Concerns\WithEmailsResource; class FacilityResource extends JsonResource { use WithEmailsResource; public function toArray($request): array { return [ 'id' => $this->id, 'name' => $this->name, ...$this->emailsResource(), ]; } }
Validation
The EmailRequest form request validates:
| Field | Rules |
|---|---|
email |
required, email, max:255 |
type |
sometimes, string (validated against config when allow_custom_types is false) |
is_primary |
sometimes, boolean |
is_verified |
sometimes, boolean |
verified_at |
nullable, date |
metadata |
nullable, array |
Configuration
// config/emails.php return [ // 'auto' detects stancl/tenancy, 'single' or 'multi' to force 'tenancy_mode' => 'auto', // Allowed email types 'types' => ['personal', 'work', 'billing', 'other'], // Default type when none specified 'default_type' => 'personal', // When false, only types in the 'types' array are accepted 'allow_custom_types' => true, ];
Database Schema
CREATE TABLE emails ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, emailable_type VARCHAR(255) NOT NULL, emailable_id BIGINT UNSIGNED NOT NULL, type VARCHAR(50) DEFAULT 'personal', is_primary BOOLEAN DEFAULT FALSE, email VARCHAR(255) NOT NULL, is_verified BOOLEAN DEFAULT FALSE, verified_at TIMESTAMP NULL, metadata JSON NULL, created_at TIMESTAMP NULL, updated_at TIMESTAMP NULL, INDEX (emailable_type, emailable_id), INDEX (type), INDEX (is_primary), INDEX (email) );
Testing
composer test
License
MIT License. See LICENSE for details.
joepages/laravel-emails 适用场景与选型建议
joepages/laravel-emails 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 345 次下载、GitHub Stars 达 0, 最近一次更新时间为 2026 年 02 月 02 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「laravel」 「polymorphic」 「emails」 「multi-tenancy」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 joepages/laravel-emails 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 joepages/laravel-emails 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 joepages/laravel-emails 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Laravel Ownership simplify management of Eloquent model's owner.
A laravel package for blacklisting or whitelisting specific email providers or domains
Implement a polymorphic morphMany relationship for managing attachments within Filament
A Laravel package providing a full-featured, framework-agnostic commenting system for any Eloquent model.
Metamel Addresses is a polymorphic Laravel package, for address book management. You can add addresses to any eloquent model with ease.
Emails addon for Bear Framework
统计信息
- 总下载量: 345
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 26
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-02-02