本文目录导读:

PHP 与 Directus,通常是指 在 PHP 项目中使用 Directus 作为无头 CMS(Headless CMS)后台,Directus 本身是一个后端 API 管理工具(基于 Node.js),而你的 PHP 项目则作为客户端通过 HTTP 请求调用 Directus 提供的 REST 或 GraphQL API 来获取/管理数据。
下面分场景说明:
理解关系
- Directus:安装在自己的服务器上(Node.js + 数据库),提供管理后台和 API。
- PHP:你的 Web 应用(如 Laravel、Symfony、原生 PHP)通过 cURL / Guzzle 等 HTTP 客户端请求 Directus API。
数据流:
PHP 应用 → (HTTP请求) → Directus API → Directus 数据库(MySQL/PostgreSQL)
在 PHP 中调用 Directus API
假设你的 Directus 已安装并配置好(访问地址:https://your-directus.com),用户 token 已获取。
1 用 Guzzle(推荐)
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client([
'base_uri' => 'https://your-directus.com',
'headers' => [
'Authorization' => 'Bearer YOUR_STATIC_TOKEN',
'Content-Type' => 'application/json',
]
]);
// 读取文章集合
$response = $client->get('/items/articles', [
'query' => [
'fields' => 'id,title,content',
'limit' => 10,
]
]);
$data = json_decode($response->getBody(), true);
print_r($data['data']); // 输出文章列表
2 用 cURL(无框架)
<?php
$url = "https://your-directus.com/items/articles?fields=id,title,content";
$token = "YOUR_STATIC_TOKEN";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $token",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data['data']);
身份验证(获取 Token)
Directus 支持几种认证方式,PHP 中常用:
1 静态 Token(永久有效)
在 Directus 后台用户设置中生成静态 token,直接写在代码里(注意安全)。
2 登录获取临时 Token
$client = new Client(['base_uri' => 'https://your-directus.com']);
$response = $client->post('/auth/login', [
'json' => [
'email' => 'admin@example.com',
'password' => 'your-password'
]
]);
$token = json_decode($response->getBody())->data->access_token;
// 后续请求使用这个 token
常见操作示例
查询单个文章
$response = $client->get('/items/articles/1');
创建新文章
$response = $client->post('/items/articles', [
'json' => [
'title' => 'Hello Directus',
'content' => 'Content here...',
'status' => 'published'
]
]);
上传文件
$response = $client->post('/files', [
'multipart' => [
[
'name' => 'file',
'contents' => fopen('/path/to/image.jpg', 'r'),
'filename' => 'image.jpg'
],
[
'name' => 'data',
'contents' => json_encode(['title' => 'My Image'])
]
]
]);
使用 SDK 或封装库(推荐)
可以用官方或社区 PHP SDK 简化开发:
-
Directus PHP SDK(非官方但成熟):
alexdresco/directus-php-sdkcomposer require alexdresco/directus-php-sdk
-
自定义封装类:将 API 调用封装成 Service 类,便于维护。
注意事项
| 事项 | 说明 |
|---|---|
| Token 安全性 | 静态 token 写入代码有风险,建议使用环境变量(.env)或临时 token。 |
| API 版本 | 检查你的 Directus 版本(v9/v10 API 略有不同),最新版使用 /items、/auth 等标准路径。 |
| 字段映射 | Directus 会自动添加 id、date_created、date_updated,自定义字段名建议用下划线。 |
| 权限 | 确保 PHP 请求使用的用户/角色拥有足够的 API 权限。 |
完整示例(Laravel 项目中)
// config/directus.php
return [
'url' => env('DIRECTUS_URL'),
'token' => env('DIRECTUS_TOKEN'),
];
// app/Services/DirectusService.php
class DirectusService {
protected $client;
public function __construct() {
$this->client = new Client([
'base_uri' => config('directus.url'),
'headers' => [
'Authorization' => 'Bearer ' . config('directus.token')
]
]);
}
public function getArticles() {
$response = $this->client->get('/items/articles');
return json_decode($response->getBody(), true)['data'];
}
}
这样你的 Laravel 控制器就可以 $articles = $directusService->getArticles(); 获取数据了。
如果你问的是 在 Directus 中编写 PHP 扩展/插件,那是另一种情况(Directus 扩展通常用 JavaScript/Vue,不支持 PHP),如果是指这个方向,请进一步说明你的需求。