taywils / patomic
Datomic REST API 的面向对象 PHP 接口
Requires
- php: >=5.4.0
- igorw/edn: 1.0.x-dev
- nikic/phlexy: ~1.0-dev
Requires (Dev)
- phpunit/phpunit: 4.1.*
This package is not auto-updated.
Last update: 2024-09-28 15:34:12 UTC
README
要求
- 完整的 Java 开发环境 java.com,包括 JDK 和 JRE
- Datomic 免费版 datomic.com/free
- Composer
- PHP >= 5.4(使用 traits)
快速入门
满足要求并下载 Datomic 后。
$ cd [directory_where_datomic_is_installed]
$ ./bin/rest -p 9998 example datomic:mem://
现在在您的硬盘上创建一个新的目录,用于存放新的 Patomic 项目的文件。
$ cd ~
$ mkdir [my_patomic_project_name]
$ cd [my_patomic_project_name]
$ touch composer.json
将以下内容添加到您的 composer.json 中,以便 composer 为您的项目安装 Patomic。
{ "require": { "taywils/patomic": "dev-master", "igorw/edn": "1.0.*@dev", "nikic/phlexy": "1.0.*@dev" } }
运行 composer install 并检查任何可能的错误。此步骤可能因您如何/在哪里安装 composer 而有所不同,但对于运行最新版本 Ubuntu 的典型 Linux 机器。
$ sudo php composer.phar install
在同一目录下,我们现在要创建一个新文件;让我们称它为 app.php
$ touch app.php
使用您喜欢的编辑器/IDE 打开 app.php 并添加以下内容。
<?php /* app.php */ require __DIR__ . '/vendor/autoload.php'; use \taywils\Patomic\Patomic; use \taywils\Patomic\PatomicEntity; use \taywils\Patomic\PatomicTransaction; use \taywils\Patomic\PatomicQuery; use \taywils\Patomic\PatomicException; function createDb() { $patomic = new Patomic("https://", 9998, "mem", "example"); $patomic->createDatabase("blog"); $patomic->setDatabase("blog"); } try { createDb(); } catch(PatomicException $pe) { echo $pe->getMessage() . PHP_EOL; }
运行它,您应该有一个新的 Datomic 实例,使用内存存储运行在 https://:9998 上(如果您在端口 9998 上运行应用程序,请随意使用不同的端口)。有关 Datomic REST 网络界面的更多信息,请参阅官方文档,网址为 http://docs.datomic.com/rest.html。
让我们创建一个简单的模式来演示 Patomic 如何帮助 PHP 开发人员利用 Datomic。假设您想创建以下模式;(别忘了 Patomic 还可以导入 .edn 文件)
{:db/id #db/id[:db.part/db] :db/ident :author/firstName :db/valueType :db.type/string :db/cardinality :db.cardinality/one :db/doc "Blog post author's first name" :db.install/_attribute :db.part/db} {:db/id #db/id[:db.part/db] :db/ident :author/lastName :db/valueType :db.type/string :db/cardinality :db.cardinality/one :db/doc "Blog post author's last name" :db.install/_attribute :db.part/db} {:db/id #db/id[:db.part/db] :db/ident :author/favoriteColor :db/valueType :db.type/string :db/cardinality :db.cardinality/one :db/doc "Blog post author's favorite color" :db.install/_attribute :db.part/db}
熟悉 EDN 的人会感到很自在,但对于 PHP 开发人员来说,以下内容是 Patomic 的等效物。
/* Add this to your existing app.php */ function createSchema() { $authorFirstName = new PatomicEntity(); $authorFirstName ->ident("author", "firstName") ->valueType("string") ->cardinality("one") ->doc("Blog post author's first name") ->install("attribute"); $authorLastName = new PatomicEntity(); $authorLastName ->ident("author", "lastName") ->valueType("string") ->cardinality("one") ->doc("Blog post author's last name") ->install("attribute"); $authorFavColor = new PatomicEntity(); $authorFavColor ->ident("author", "favoriteColor") ->valueType("string") ->cardinality("one") ->doc("Blog post author's favorite color") ->install("attribute"); $pt = new PatomicTransaction(); $pt->append($authorFirstName) ->append($authorLastName) ->append($authorFavColor); return $pt; }
现在我们将演示如何向我们的模式添加数据,例如,考虑以下 EDN。
[ {:db/id #db/id [:db.part/user] :author/firstName "Sam" :author/lastName "Smith" :author/favoriteColor "Green"} {:db/id #db/id [:db.part/user] :author/firstName "Melissa" :author/lastName "Grey" :author/favoriteColor "Purple"} {:db/id #db/id [:db.part/user] :author/firstName "Danny" :author/lastName "Ward" :author/favoriteColor "Orange"} ]
在 Patomic 中,我们将添加数据的交易表示为以下内容。
/* Add this to your existing app.php */ function addData() { $pt = new PatomicTransaction(); $pt->addMany(null, array("author" => "firstName", "Sam"), array("author" => "lastName", "Smith"), array("author" => "favoriteColor", "Green") ); $pt->addMany(null, array("author" => "firstName", "Melissa"), array("author" => "lastName", "Grey"), array("author" => "favoriteColor", "Purple") ); $pt->addMany(null, array("author" => "firstName", "Danny"), array("author" => "lastName", "Ward"), array("author" => "favoriteColor", "Orange") ); return $pt; }
要查询我们的数据,让我们首先考虑 EDN,这是如果您已经熟悉 Datomic 可以使用的。别忘了;对于高级用户,Patomic 可以使用字符串编写的原始 EDN 查询。
[:find ?firstName ?lastName :in $ :where [?entity :author/firstName ?firstName] [?entity :author/lastName ?lastName]]
再次,熟悉 EDN 的人会感到很自在,但对于学习 EDN 的 PHP 开发人员,我们使用 PatomicQuery 对象。
/* Add this to your existing app.php */ function createQuery() { $pq = new PatomicQuery(); $pq->find("firstName", "lastName") ->where(array("entity" => "author/firstName", "firstName")) ->where(array("entity" => "author/lastName", "lastName")); return $pq; }
将所有函数组合在一起,最后我们需要创建一个 Patomic 对象,该对象将发送我们的交易并运行我们的查询。
<?php /* Complete app.php */ require __DIR__ . '/vendor/autoload.php'; use \taywils\Patomic\Patomic; use \taywils\Patomic\PatomicEntity; use \taywils\Patomic\PatomicTransaction; use \taywils\Patomic\PatomicQuery; use \taywils\Patomic\PatomicException; function createDb() { $patomic = new Patomic("https://", 9998, "mem", "example"); $patomic->createDatabase("blog"); $patomic->setDatabase("blog"); return $patomic; } function createSchema() { $authorFirstName = new PatomicEntity(); $authorFirstName ->ident("author", "firstName") ->valueType("string") ->cardinality("one") ->doc("Blog post author's first name") ->install("attribute"); $authorLastName = new PatomicEntity(); $authorLastName ->ident("author", "lastName") ->valueType("string") ->cardinality("one") ->doc("Blog post author's last name") ->install("attribute"); $authorFavColor = new PatomicEntity(); $authorFavColor ->ident("author", "favoriteColor") ->valueType("string") ->cardinality("one") ->doc("Blog post author's favorite color") ->install("attribute"); $pt = new PatomicTransaction(); $pt->append($authorFirstName) ->append($authorLastName) ->append($authorFavColor); return $pt; } function addData() { $pt = new PatomicTransaction(); $pt->addMany(null, array("author" => "firstName", "Sam"), array("author" => "lastName", "Smith"), array("author" => "favoriteColor", "Green") ); $pt->addMany(null, array("author" => "firstName", "Melissa"), array("author" => "lastName", "Grey"), array("author" => "favoriteColor", "Purple") ); $pt->addMany(null, array("author" => "firstName", "Danny"), array("author" => "lastName", "Ward"), array("author" => "favoriteColor", "Orange") ); return $pt; } function createQuery() { $pq = new PatomicQuery(); $pq->find("firstName", "lastName") ->where(array("entity" => "author/firstName", "firstName")) ->where(array("entity" => "author/lastName", "lastName")); return $pq; } try { $patomic = createDb(); $patomic->commitTransaction( createSchema() ); $patomic->commitTransaction( addData() ); $patomic->commitRegularQuery( createQuery() ); $data = $patomic->getQueryResult(); print_r($data); } catch(PatomicException $pe) { echo $pe->getMessage() . PHP_EOL; }
最后运行 app.php,如果成功,您应该会看到以下内容。
INFO: Database "blog" created
INFO: A Patomic object set database to blog
INFO: commitTransaction success
INFO: commitTransaction success
INFO: commitQuery success
Array
(
[0] => Array
(
[firstName] => Danny
[lastName] => Ward
)
[1] => Array
(
[firstName] => Sam
[lastName] => Smith
)
[2] => Array
(
[firstName] => Melissa
[lastName] => Grey
)
)
有关更多信息,请访问 Patomic 的 GitHub 页面 http://taywils.github.io/patomic/
关于/功能
- Patomic 为 PHP 开发人员提供了一种与 Datomic 数据库通信的方式。
- 基于 igorw 的出色的 PHP EDN 解析器 github.com/igorw/edn
- 使用 composer 进行易于管理的依赖项管理
- 使用 PHPUnit 进行单元测试
- 可用于 HipHopVM