taywils/patomic

Datomic REST API 的面向对象 PHP 接口

dev-master 2014-10-15 03:40 UTC

This package is not auto-updated.

Last update: 2024-09-28 15:34:12 UTC


README

Build Status

要求

  1. 完整的 Java 开发环境 java.com,包括 JDK 和 JRE
  2. Datomic 免费版 datomic.com/free
  3. Composer
  4. 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

那么什么是 Datomic,为什么我应该关心?