prezly / draft-php
PHP 实现的 Draft.js 内容状态模型,允许在服务器端处理 Draft.js 生成的内容。
2.0.2
2022-09-14 12:07 UTC
Requires
- php: >=7.3
- ext-json: *
- ext-mbstring: *
Requires (Dev)
- phpunit/phpunit: ^9.5.0
- prezly/code-style: ^3.0
This package is auto-updated.
Last update: 2024-09-14 16:24:14 UTC
README
PHP 实现的 Draft.js 内容状态模型,允许在服务器端处理 Draft.js 生成的内容。
目录
使用方法
读取 ContentState JSON
// raw JSON content state coming from Draft.js frontend $json = '{ "blocks":[ { "key": "7si2a", "text": "Say hello to world!", "type": "unstyled", "depth": 0, "inlineStyleRanges": [ { "style": "BOLD", "offset": 0, "length": 9 } ], "entityRanges": [ { "key": "0", "offset": 0, "length": 9 } ], "data": {} } ], "entityMap":{ "0":{ "type":"link", "mutability":"MUTABLE", "data":{ "href":"https://www.prezly.com/" } } } }'; // convert raw JSON state to ContentState model object $contentState = \Prezly\DraftPhp\Converter::convertFromJson($json); // or $rawState = json_decode($json); // Note: raw state should be an stdClass object, not an associative array $contentState = \Prezly\DraftPhp\Converter::convertFromRaw($rawState); var_dump($contentState); /* Prezly\DraftPhp\Model\ContentState { -_blocks: array:1 [ 0 => Prezly\DraftPhp\Model\ContentBlock {#1507 -_key: "7si2a" -_type: "unstyled" -_text: "Say hello to world!" -_characterList: array:19 [ 0 => Prezly\DraftPhp\Model\CharacterMetadata {#1506 -_style: ["BOLD"] -_entity: "0" } 1 => Prezly\DraftPhp\Model\CharacterMetadata {#1506} 2 => Prezly\DraftPhp\Model\CharacterMetadata {#1506} 3 => Prezly\DraftPhp\Model\CharacterMetadata {#1506} 4 => Prezly\DraftPhp\Model\CharacterMetadata {#1506} 5 => Prezly\DraftPhp\Model\CharacterMetadata {#1506} 6 => Prezly\DraftPhp\Model\CharacterMetadata {#1506} 7 => Prezly\DraftPhp\Model\CharacterMetadata {#1506} 8 => Prezly\DraftPhp\Model\CharacterMetadata {#1506} 9 => Prezly\DraftPhp\Model\CharacterMetadata {#1490 -_style: [] -_entity: null } 10 => Prezly\DraftPhp\Model\CharacterMetadata {#1490} 11 => Prezly\DraftPhp\Model\CharacterMetadata {#1490} 12 => Prezly\DraftPhp\Model\CharacterMetadata {#1490} 13 => Prezly\DraftPhp\Model\CharacterMetadata {#1490} 14 => Prezly\DraftPhp\Model\CharacterMetadata {#1490} 15 => Prezly\DraftPhp\Model\CharacterMetadata {#1490} 16 => Prezly\DraftPhp\Model\CharacterMetadata {#1490} 17 => Prezly\DraftPhp\Model\CharacterMetadata {#1490} 18 => Prezly\DraftPhp\Model\CharacterMetadata {#1490} ] -_depth: 0 -_data: [] } ] -_entityMap: array:1 [ 0 => Prezly\DraftPhp\Model\EntityInstance {#1505 -_type: "link" -_mutability: "MUTABLE" -_data: array:1 [ "href" => "https://www.prezly.com/" ] } ] } */ var_dump($contentState->blocks[0]->characterList[0]); /* Prezly\DraftPhp\Model\CharacterMetadata {#1506 -_style: ["BOLD"] -_entity: "0" } */ var_dump($contentState->getEntity($contentState->blocks[0]->characterList[0]->entity)); /* Prezly\DraftPhp\Model\EntityInstance {#1505 -_type: "link" -_mutability: "MUTABLE" -_data: array:1 [ "href" => "https://www.prezly.com/" ] } */
将 ContentState 序列化为 JSON
// convert raw JSON state to ContentState model object $contentState = \Prezly\DraftPhp\Converter::convertFromJson($json); $serializedJson = \Prezly\DraftPhp\Serializer::serialize($contentState); // or $serializedJson = json_serialize($contentState); // now $json is equivalent to $serializedJson (formatting and order may differ though) // see SerializerTest for examples
实现说明
-
ContentState 现在包含一个
$entityMap
属性,并且有->getEntity(string $entityKey)
方法。这种做法允许将所有来自 JSON 的数据封装到一个单独的对象中,然后用于渲染。拥有全局静态实体池(如在原生 Draft.js 实现和 Draft.js 模型另一个 PHP 端口中的实现)并不那么有用。全局状态会在你需要在一个 PHP 进程中渲染多个内容状态时阻碍你。此外,它还使测试变得复杂。
-
所有模型类都是不可变的。这是通过将所有数据存储在私有属性中,只提供获取器作为公共 API(
getXxxx
方法 + 魔术__get()
方法来模拟只读公共属性)来实现的。
其他实现
- webstronauts/draft-php — Draft.js 模型规范的逐行端口,经过良好测试
许可协议
致谢
由 Prezly 构建,🤘 — 为公关沟通量身定制的 CRM 软件