xcopy/laravel-contacts
Composer 安装命令:
composer require xcopy/laravel-contacts
包简介
A simple Laravel package for managing polymorphic contact information for any Eloquent model.
README 文档
README
A simple Laravel package for managing polymorphic contact information (phone, email, mobile, WhatsApp, Telegram, website, etc.) for any Eloquent model. Perfect for multi-tenant SaaS applications, CRMs, or property management systems where multiple entities need contact details.
Features
- Polymorphic relationships: Attach contacts to any Eloquent model
- Multiple contact types: Phone, Email, WhatsApp, Telegram, Website, and Other
- Smart value handling: Automatic validation and normalization via strategy pattern
- Primary & verified flags: Mark contacts as primary or verified
- Unique constraints: Prevents duplicate contacts per model
- Type-safe: Uses PHP 8.1+ enums and strict typing
Installation
composer require xcopy/laravel-contacts:dev-main
Run the installation commands:
php artisan vendor:publish --provider="Jenishev\Laravel\Contacts\ContactsServiceProvider" --tag=config php artisan vendor:publish --provider="Jenishev\Laravel\Contacts\ContactsServiceProvider" --tag=migrations php artisan migrate
Usage
1. Add the trait to your model
Add the HasContacts trait to any model that needs contact information:
use Illuminate\Database\Eloquent\Model; use Jenishev\Laravel\Contacts\Concerns\HasContacts; class Company extends Model { use HasContacts; // ... your model code }
2. Create contacts
use Jenishev\Laravel\Contacts\Enums\ContactTypeEnum; $company = Company::find(1); // Create a primary email contact $company->contacts()->create([ 'type' => ContactTypeEnum::Email, 'value' => 'info@company.com', 'is_primary' => true, 'is_verified' => true, ]); // Create a phone contact $company->contacts()->create([ 'type' => ContactTypeEnum::Phone, 'value' => '+1234567890', 'is_primary' => false, ]); // Create a WhatsApp contact $company->contacts()->create([ 'type' => ContactTypeEnum::Whatsapp, 'value' => '+1234567890', ]);
3. Retrieve contacts
// Get all contacts $contacts = $company->contacts; // Get contacts of a specific type $emails = $company->contacts()->where('type', ContactTypeEnum::Email)->get(); // Get primary contact $primaryContact = $company->contacts()->where('is_primary', true)->first(); // Get verified contacts $verified = $company->contacts()->where('is_verified', true)->get();
4. Value validation & normalization
Contact values are automatically validated and normalized based on their type:
// Email: lowercased and validated $company->contacts()->create([ 'type' => ContactTypeEnum::Email, 'value' => 'User@Example.COM', // stored as: user@example.com ]); // Phone: formatted to E.164 $company->contacts()->create([ 'type' => ContactTypeEnum::Phone, 'value' => '0555123456', // stored as: +996555123456 'country_code' => 'KG', // optional, defaults to config ]); // Telegram: normalized username $company->contacts()->create([ 'type' => ContactTypeEnum::Telegram, 'value' => '@UserName', // stored as: username, retrieved as: @username ]); // Website: normalized URL $company->contacts()->create([ 'type' => ContactTypeEnum::Website, 'value' => 'example.com', // stored as: https://example.com ]); // WhatsApp: formatted to E.164 $company->contacts()->create([ 'type' => ContactTypeEnum::Whatsapp, 'value' => '0555123456', // stored as: +996555123456 'country_code' => 'KG', ]);
Validation rules:
- Email: Valid email format, lowercased
- Phone: Valid phone number for country, formatted per config (default: NATIONAL)
- WhatsApp: Valid phone number for country, E.164 format
- Telegram: 5–32 chars, alphanumeric and underscore, no consecutive/leading/trailing underscores
- Website: Valid URL, auto-adds
https://if missing - Other: No validation, stored as-is
5. Phone number formatting
Phone numbers support configurable formatting via config/contacts.php:
// Available formats: E164, INTERNATIONAL, NATIONAL, RFC3966 // See: \libphonenumber\PhoneNumberFormat constants 'phone_format_set' => \libphonenumber\PhoneNumberFormat::NATIONAL, // Storage format 'phone_format_get' => \libphonenumber\PhoneNumberFormat::NATIONAL, // Retrieval format
Format examples:
- E164:
+996555123456 - INTERNATIONAL:
+996 555 123 456 - NATIONAL:
0555 123 456(default) - RFC3966:
tel:+996-555-123456
Testing
composer test
Changelog
Please see CHANGELOG for more information on what has changed recently.
License
The MIT License (MIT). Please see License File for more information.
xcopy/laravel-contacts 适用场景与选型建议
xcopy/laravel-contacts 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 5 次下载、GitHub Stars 达 0, 最近一次更新时间为 2026 年 03 月 22 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「email」 「phone」 「laravel」 「contacts」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 xcopy/laravel-contacts 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 xcopy/laravel-contacts 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 xcopy/laravel-contacts 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Phone helper & validator for Nette Framework
Yii2 phone formatter and validator.
Extensible library for building notifications and sending them via different delivery channels.
Email+ extends Kirby's email capabilities by adding support for multiple email services using the same Kirby email API.
Yii2 extension for Mobile-Detect library
Laravel contact us form package to send email and save to database
统计信息
- 总下载量: 5
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 29
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-03-22