jgswift/persistr

PHP 5.5+ 轻量级持久化层

0.1.1 2014-06-02 12:59 UTC

This package is not auto-updated.

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


README

PHP 5.5+ 轻量级持久化层

Build Status Scrutinizer Code Quality

安装

通过 Composer 安装

php composer.phar require jgswift/persistr:dev-master

用法

persistr 是一个轻量级的 PHP 包,它实现了一个松散的持久化层。

persistr 在定义模型时不一定使用注解或其他类型的模型元数据。然而,这并不妨碍包含一个正式的建模组件。

此外,persistr 模型可以完全依赖任何数据源事务。将平台依赖的代码放入持久化接口实现通常是不良的实践。这样的代码只适用于模型本身。

persistr 假设你知道如何与你的相应数据源交互,并且不是一个完全的数据库抽象层。

persistr 根据签名标准(如特质的呈现、接口的存在或仅仅是单个类名本身)区分对象持久化实现。

当将持久化应用于单个类时,所有继承的类默认自然具有相同的扩展。

以下是一个使用接口/特质对签名(接口是默认的区分元素)的空白模型的默认示例。

<?php
class MyUser implements persistr\Interfaces\Persistent {
    use persistr\Persistent;

}

$user = new MyUser;

$model = $user->getModel();

$model->bind('foo',function() {
    return 'bar';
});

$value = $user->foo;

var_dump($value); // returns 'bar'

在上述类上不需要指定接口,因为只需要特质就可以识别签名。有多个识别技术可用,即 traitinterfaceclass

以下是设置基于类的自定义持久化接口的示例。

首先,我们定义一个模型类、输入/输出过滤器,最后将其注册到持久化层。

// MODEL CLASS
class MyUserModel implements persistr\Interfaces\Model {
    private $className;
    private static $registry;

    function __construct($className) {
        $this->className = $className;
        if(empty(self::$registry)) {
            self::$registry = new persistr\Object\Registry($this,$className);
        }
    }

    public function getClassName() {
        return $this->className;
    }

    public function getRegistry() {
        return self::$registry;
    }

    public function bind($attribute, callable $callable=null) {
        persistr\Object\Binding\Registry::bind(self::$registry->getTypeName(), $attribute, $callable);
        return $this;
    }

    public function bindTo($object,$attribute,callable $callable=null) {
        persistr\Object\Binding\Registry::bindTo($object, $attribute, $callable);
        return $this;
    }
}

// PERSISTENCE REGISTRATION
$persistor = new persistr\Persistor('MyUser');
persistr\Registry::register($persistor);

$model = new MyUserModel('MyUser');

$persistor->getDataSource()->insert('MyUser',$model);

现在,当实例化 MyUser 对象时,将使用给定的 MyUserModel 模型来映射对象。