内容
# Laravel Post2Site
[](https://github.com/n2ns/laravel-post2site)
[](https://packagist.org/packages/n2ns/laravel-post2site)
[](./LICENSE)
[](https://www.php.net)
[](https://laravel.com)
Laravel 后端包,用于 N2N Post2Site 内容发布 API 合同。它允许 Laravel 站点安全地接受来自 [`n2n-post2site`](https://github.com/n2ns/n2n-post2site) MCP 客户端的内容。
它提供受保护的发布路由、包拥有的暂存表用于草稿和翻译、可选的配置发布到主机 Eloquent 模型、自定义 `PublicationTarget` 适配器用于复杂站点,以及发布帖子后的可选 IndexNow 提交。
该包是通用的:`content_scope` 是不透明的 `kind:key` 元数据,URL 形状、范围验证、范围上下文、发布目标和索引都是主机绑定合同。没有主机特定的类别被嵌入。
对于常见站点,Post2Site 还可以通过预设激活。第一方预设是 `laravel_saas_kit`,它发布到 SaaS Kit 的 `blog_posts` 和 `blog_post_translations` 表,并通过 `product:{code}` 内容范围支持产品指南。
## 📋 要求
- PHP 8.2+,搭配 Laravel 12。
- PHP 8.3+,搭配 Laravel 13。
Composer 约束允许 Laravel 12 和 13。当前锁定的测试基线验证 Laravel 12;在添加 Laravel 13 CI 矩阵之前,请对 Laravel 13 主机集成进行显式项目验证。
## 🚀 安装
```bash
composer require n2ns/laravel-post2site
php artisan vendor:publish --tag=post2site-config
php artisan migrate
php artisan post2site:key "Production MCP"
```
命令打印纯文本 API 密钥一次 — 将其存储为 MCP 客户端的 `CONTENT_API_KEY`。将客户端的 `CONTENT_API_BASE_URL` 指向 `https://your-host/<route_prefix>`(默认路由前缀 `api/v1/mcp`)。
配置 [`n2n-post2site`](https://github.com/n2ns/n2n-post2site) MCP 客户端指向此主机:
```json
{
"mcpServers": {
"n2n-post2site": {
"command": "npx",
"args": ["-y", "n2n-post2site"],
"env": {
"CONTENT_API_BASE_URL": "https://your-host/api/v1/mcp",
"CONTENT_API_KEY": "the-key-printed-above"
}
}
}
}
```
## 📰 发布模式
设置 `POST2SITE_PUBLISHING_MODE`(或 `post2site.publishing.mode`):
- **`review`**(默认)— 在暂存表中标记草稿已发布,无需主机代码。公共 `link` 从 `public_url.pattern` 生成。
- **`configurable`** — 通过配置将字段映射到主机 Eloquent 模型;不需要 PHP 类。
- **`adapter`** — 绑定自定义 `PublicationTarget` 以处理关系、分类法、外部 CMS 等。
参见每个模式的 [主机集成指南](docs/integration.md)。
## 🧩 博客目标
当前预设:
- `laravel_saas_kit` — 第一方适配器。支持博客帖子和产品指南。目标应用当前使用 Laravel 12。
- `austintoddj_canvas` — `austintoddj/canvas` 的适配器预设。
- `bjuppa_laravel_blog` — `bjuppa/laravel-blog` 的可配置预设。
- `stephenjude_filament_blog` — `stephenjude/filament-blog` 5.x 的可配置预设。主机仍需要确保作者/类别要求符合其模式。
## 🔑 关键行为
- **身份验证** — 数据库驱动的 API 密钥存储为确定性 SHA-256 哈希,并通过唯一索引(O(1))进行匹配;静态驱动程序比较单个配置密钥。
- **速率限制** — 每个路由都受到限制。可通过 `POST2SITE_RATE_LIMIT`(`max,minutes`,默认为 `60,1`)进行调整。
- **搜索** — `?q=` 在 MySQL/MariaDB 上使用 `FULLTEXT` 索引(由驱动器上的迁移创建),并在其他地方(例如 SQLite)回落到 `LIKE`。
- **content_scope** — 可选 `kind:key`;对于 `content.scoped_types` 中的类型(默认为 `['guide']`)是必需的,对于其他类型是禁止的。种类和密钥解析是主机可配置的。
## 🧩 扩展合同
从 `post2site.bindings` 绑定并可覆盖:`PostRepository`、`PublicationTarget`、`PublicUrlResolver`、`ContentScopeValidator`、`ScopeContextProvider`、`IndexingNotifier`。参见 [架构](docs/architecture.md)。
## 🧪 测试
```bash
composer test # PHPUnit
composer pint:test # 代码风格
```
## 📦 Composer 元数据
Packagist 显示来自 `composer.json` 的 Composer 链接字段:
- **建议** — 与此包一起使用但不是必需的的可选包。Post2Site 使用此功能支持可选目标,例如 SaaS Kit、Canvas 和已知博客包。
- **提供** — 此包实现的虚拟包。Post2Site 目前不实现共享虚拟包,因此保持为空。
- **冲突** — 无法与此包一起安装的包或版本。留空除非已验证实际不兼容。
- **替换** — 此包提供或替换的代码包。Post2Site 不替换其他包,因此保持为空。
## 📖 文档
- [主机集成指南](docs/integration.md)
- [博客目标](docs/blog-packages.md)
- [架构](docs/architecture.md)
- [变更日志](CHANGELOG.md)
- [贡献](CONTRIBUTING.md)
## 📄 许可证
该项目根据 [MIT 许可证](./LICENSE) 许可。
---
由 [N2NS Lab](https://n2ns.com) 构建,这是一个用于实用 AI 开发工具的开源实验室。