2025新版Monica插件开发指南:3步打造你的专属联系人管理功能
你是否曾想过自定义Monica的联系人管理功能?比如添加专属的社交账号字段或自动化生日提醒?本文将带你通过3个核心步骤,从零构建一个能自动识别重要联系人的插件,无需复杂的框架知识,只需基础PHP语法。
插件开发准备:理解Monica的扩展机制
Monica作为开源联系人管理工具(Contact Management System,CMS),采用Laravel框架的服务提供者(Service Provider)模式实现功能扩展。在开始前,请确保已通过以下命令克隆项目:
git clone https://gitcode.com/gh_mirrors/mo/monica
核心扩展入口
Monica的服务注册中心位于app/Providers/AppServiceProvider.php,所有自定义功能需通过此类注册。该文件第52-123行的register()方法负责加载扩展,第130-170行的boot()方法处理初始化逻辑。
必备开发文件
| 文件路径 | 作用 |
|---|---|
| app/Interfaces/ServiceInterface.php | 定义服务必须实现的规则验证和权限控制接口 |
| app/Services/BaseService.php | 提供基础服务类,包含事件调度和数据库操作 |
| config/app.php | 应用配置中心,需在此注册自定义服务提供者 |
第一步:创建插件服务类
以"重要联系人自动标记"插件为例,我们需要创建一个能分析联系人互动频率的服务。在app/Services目录下新建ImportantContactService.php:
<?php
namespace App\Services;
use App\Models\Contact;
use App\Interfaces\ServiceInterface;
class ImportantContactService extends BaseService implements ServiceInterface
{
// 规则定义:每天最多标记10个联系人
public function rules(): array
{
return [
'max_daily_marks' => 10
];
}
// 权限控制:仅管理员可使用
public function permissions(): array
{
return [
'require_admin' => true
];
}
// 核心功能:标记30天内互动超5次的联系人
public function markImportantContacts(): void
{
$thresholdDate = now()->subDays(30);
Contact::whereHas('interactions', function ($query) use ($thresholdDate) {
$query->where('created_at', '>=', $thresholdDate)
->groupBy('contact_id')
->havingRaw('COUNT(*) >= 5');
})->update(['is_important' => true]);
}
}
第二步:注册服务到应用
修改app/Providers/AppServiceProvider.php,在register()方法中添加服务绑定:
// 在第58行后插入
$this->app->singleton(
'important.contact.service',
\App\Services\ImportantContactService::class
);
然后在boot()方法注册定时任务(第167行后):
// 每天凌晨2点执行重要联系人标记
$this->app['events']->listen('daily-cron', function () {
$this->app->make('important.contact.service')->markImportantContacts();
});
第三步:创建前端展示组件
在resources/views/contacts/partials目录下创建important-badge.blade.php:
@if($contact->is_important)
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800">
<svg class="w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path>
</svg>
重要联系人
</span>
@endif
插件部署与测试
启用服务
编辑config/app.php,在第197行的providers数组添加服务提供者:
'providers' => [
// ...其他服务
App\Providers\ImportantContactServiceProvider::class,
],
执行数据库迁移
php artisan make:migration add_important_flag_to_contacts
在生成的迁移文件中添加:
public function up()
{
Schema::table('contacts', function (Blueprint $table) {
$table->boolean('is_important')->default(false);
});
}
运行迁移并测试插件:
php artisan migrate
php artisan tinker
>>> app('important.contact.service')->markImportantContacts()
进阶开发指南
事件监听扩展
可通过监听app/Providers/AppServiceProvider.php中注册的FileDeleted事件(第158行),实现删除联系人时自动清理标记记录。
前端资源加载
将自定义CSS/JS放置在public/vendor/your-plugin/目录,通过Vite预加载(第167行):
Vite::prefetch(concurrency: 3)->add('vendor/your-plugin/main.js');
权限控制最佳实践
参考app/Policies/VaultPolicy.php实现细粒度权限,例如限制普通用户只能查看自己标记的重要联系人。
常见问题解决
- 服务注册失败:检查命名空间是否与文件路径一致,确保服务类正确实现ServiceInterface
- 数据库操作无响应:使用
DB::enableQueryLog()和dd(DB::getQueryLog())调试SQL - 前端组件不显示:运行
php artisan view:clear清除视图缓存
现在你已掌握Monica插件开发的核心流程。这个仅120行代码的插件就能显著提升联系人管理效率,更多高级功能如社交账号集成、生日提醒等,可参考官方文档的"模块开发"章节。立即动手扩展你的Monica,让联系人管理更贴合个人 workflow!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



