jackalope/jackalope-jackrabbit

Jackalope 为 Jackrabbit 提供传输库

2.0.0 2024-04-03 06:18 UTC

README

Build Status Latest Stable Version Total Downloads

Jackalope 是 PHP 内容存储库 API (PHPCR) 的强大实现。

Jackalope-Jackrabbit 使用 jackrabbit JCR 服务器作为存储引擎。

[email protected] 上讨论或在 irc.freenode.net 访问 #jackalope

许可证

此代码同时受 MIT 许可证和 Apache 许可证 Version 2.0 授权。请参阅此文件夹中的 LICENSE 文件。

先决条件

  • libxml 版本 >= 2.7.0(由于 libxml 中的错误 http://bugs.php.net/bug.php?id=36501
  • libcurl(如果使用 7.35 版本时出现“Problem (2) in the Chunked-Encoded data”,请尝试更新您的 curl 版本)
  • composer

安装

建议通过 composer 安装 jackalope。

$ mkdir my-project
$ cd my-project
$ composer init
$ composer require jackalope/jackalope-jackrabbit

Jackrabbit 存储服务器

除了 Jackalope 存储库外,您还需要 Jackrabbit 服务器组件。有关说明,请参阅 Jackalope Wiki。请确保您至少有在 协议实现的 VERSION 常量中指定的版本

phpunit 测试

如果您想运行测试,请参阅测试文件夹中的 README 文件 并检查您是否已告诉 composer 安装建议的依赖关系(参见安装)

启用命令

有几个有用的命令可以与存储库进行交互。

要使用控制台,将 cli-config.php.dist 复制到 cli-config.php 并配置连接参数。然后您可以使用 ./bin/jackalope 从 jackalope 目录运行命令

注意:如果您在 Symfony 中使用 PHPCR,DoctrinePHPCRBundle 提供了在正常 Symfony 控制台中使用的命令,您不需要进行任何特殊准备。

有一个 Jackalope 特定的命令 jackalope:run:jackrabbit,您可以使用它来启动和停止一个独立的 Jackrabbit 服务器。

您可以从 phpcr-utils 获取许多有用的命令。要获取所有命令的列表,键入

./bin/jackalope

要获取特定命令的更多信息,请使用 help 命令。例如,要了解 phpcr:workspace:export 命令的更多信息,您将键入

./bin/jackalope help phpcr:workspace:export

引导

Jackalope 依赖于自动加载。命名空间和文件夹符合 PSR-0。您应使用 composer 生成的自动加载文件:vendor/autoload.php

如果您想将 jackalope 集成到其他 PSR-0 符合的代码并使用您自己的类加载器,请在 vendor/composer/autoload_namespaces.php 中查找映射

一旦您有了自动加载,您就需要引导库。获取 Jackrabbit 后端 PHPCR 会话的最小化示例代码

$jackrabbit_url = 'http://127.0.0.1:8080/server/';
$user           = 'admin';
$pass           = 'admin';
$workspace      = 'default';

$factory = new \Jackalope\RepositoryFactoryJackrabbit();
$repository = $factory->getRepository(
    array("jackalope.jackrabbit_uri" => $jackrabbit_url)
);
$credentials = new \PHPCR\SimpleCredentials($user, $pass);
$session = $repository->login($credentials, $workspace);

要使用不同于 default 的工作区,您首先需要创建它。最简单的方法是运行命令 bin/jackalope phpcr:workspace:create <myworkspace>,当然,您也可以使用 PHPCR API 从您的代码中创建工作区。

用法

入口点是创建存储后端指定的仓库工厂。从这一点开始,使用方式没有区别(除了支持的功能之外)。

// see Bootstrapping for how to get the session.

$rootNode = $session->getNode("/");
$whitewashing = $rootNode->addNode("www-whitewashing-de");
$session->save();

$posts = $whitewashing->addNode("posts");
$session->save();

$post = $posts->addNode("welcome-to-blog");
$post->addMixin("mix:title");
$post->setProperty("jcr:title", "Welcome to my Blog!");
$post->setProperty("jcr:description", "This is the first post on my blog! Do you like it?");

$session->save();

有关如何使用 PHPCR API 的更详细教程,请参阅 PHPCR 教程

查询语言

Jackalope 支持 PHPCR 标准查询语言 SQL2 以及查询对象模型(QOM)来程序化地构建查询。我们建议使用 QOM 或在 PHPCR 教程 中提到的 QueryBuilder。它们根据后端的能力使用最好的查询语言。稍后切换到另一个 PHPCR 实现不应引起任何问题。

Jackalope-Jackrabbit 还支持 JCR 1.0 中弃用的 SQL 和 XPath 查询语言。这些语言将被 Jackrabbit 在可预见的未来支持,但几乎肯定不会被其他 PHPCR 实现支持。因此,请谨慎使用,并且只有在您了解自己在做什么的情况下才使用它们。

使用 SQL 或 XPath 的一个原因是因为较新且功能更强大的 SQL2 在 Jackrabbit 方面并没有像旧语言那样优化。与 XPath 或 SQL 相比,使用 SQL2 的查询结果集大得多时速度要慢得多。

然而,最好是使用上面提到的 QueryBuilder,让实现为您的实现选择最有效的查询语言。

性能调整

如果您知道您将需要请求的节点的大量子节点,请在 Session::getNode 上使用深度提示。这将预取子节点以减少数据库往返次数。这是 PHPCR 标准的一部分。您还可以全局设置获取深度,但这仅适用于 Jackalope:调用 Session::setSessionOption 并使用 Session::OPTION_FETCH_DEPTH 设置为大于 1 的值。

如果您只需要知道子节点的名称,但不需要实际的节点,请使用 Node::getNodeNames。请注意,在使用 jackalope 时,不应在 getNodeNames 上使用类型过滤器。然而,使用 getNodes 仅获取您感兴趣的类型的节点可以使用类型过滤器,这非常有意义。

日志记录

Jackalope 支持日志记录,例如调查使用的查询的数量和类型。要启用日志记录,请向仓库工厂提供日志记录器实例。

$factory = new \Jackalope\RepositoryFactoryJackrabbit();
$logger = new Jackalope\Transport\Logging\DebugStack();
$options = array(
    'jackalope.jackrabbit_uri' => $jackrabbit_url,
    'jackalope.logger' => $logger,
);
$repository = $factory->getRepository($options);

...

// at the end, output debug information
var_dump($logger->calls);

您还可以使用 Psr3Logger 类将一个兼容 PSR-3 的日志记录器(如 monolog)包装起来。

请注意,当在 Symfony2 中使用 jackalope 时,日志记录器集成在调试工具栏中。

实现说明

有关 Jackalope 是如何构建的介绍,请参阅 doc/architecture.md。查看源文件并生成 phpdoc。

未实现的功能

关于需要做什么的最好概述是跳过的 API 测试。查看 ImplementationLoader 以查看当前不工作的内容,并开始修改 :-)

贡献者