vespolina/molino

一个小巧快速库,用于创建与持久化后端无关的可重用工具。

dev-master 2013-12-25 07:02 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:55:47 UTC


README

Build Status

Molino是一个小巧快速库,用于创建与持久化后端无关的可重用工具。

Molino不提供用于定义模型的任何内容。这意味着您必须以常规方式定义您想要与之一起工作的后端模型。

用法

您使用molino,它只是MolinoInterface的实现。

$molino = new Molino();

名称

每个molino都必须有一个名称。

$name = $molino->getName();

创建模型

您可以通过使用带有模型类作为第一个参数的createModel方法来创建模型。

$article = $molino->create('Model\Article');

设置和获取数据

由于现在使用setter和getter已经成为一种惯例,Molino不包含任何用于抽象此功能的方法。因此,您可以以常规方式使用setter和getter与模型一起使用。

$article->setTitle('foo');
$title = $article->getTitle();

保存模型

您可以通过使用saveModel方法来保存模型。

$molino->save($article);

刷新模型

您可以通过使用refreshModel方法来刷新模型。

$molino->refresh($article);

删除模型

您可以通过使用deleteModel方法来删除模型。

$molino->delete($article);

查询

Molino有三种类型的查询:选择、更新和删除,您可以从molino创建这些查询。

$selectQuery = $molino->createSelectQuery('Model\Article');
$updateQuery = $molino->createUpdateQuery('Model\Article');
$deleteQuery = $molino->createDeleteQuery('Model\Article');

Molino和模型类

您可以从所有查询中访问molino和模型类。

$molino = $query->getMolino();
$modelClass = $query->getModelClass();

过滤

三种类型的查询可以进行过滤。

$query->filterEqual('name', 'Pablo');
$query->filterNotEqual('name', 'Pablo');

$query->filterLike('name', 'Pablo*');
$query->filterNotLike('name', '*Pablo');

$query->filterIn('name', array('Pablo', 'Pepe'));
$query->filterNotIn('name', array('Pablo', 'Pepe'));

$query->filterGreater('age', 20);
$query->filterLess('age', 20);
$query->filterGreaterEqual('age', 20);
$query->filterLessEqual('age', 20);

您还可以使用filter方法,它与这些方法相关联。

$query->filter('name', '==', 'Pablo');
$query->filter('name', '!=', 'Pablo');

$query->filter('name', 'in', array('Pablo', 'Pepe'));
$query->filter('name', 'not_in', array('Pablo', 'Pepe'));

$query->filter('age', '>', 20);
$query->filter('age', '<', 20);
$query->filter('age', '>=, 20);
$query->filter('age', '<=', 2');

选择

您可以选择您想要选择的字段。

$selectQuery->select(array('title', 'content'));

您可以排序、限制、跳过。

$selectQuery->sort('name', 'asc'); // asc o desc
$selectQuery->limit(10);
$selectQuery->skip(10);

您可以检索全部、一个和结果数量。

$articles = $selectQuery->all();
$article = $selectQuery->one();
$nbArticles = $selectQuery->count();

选择查询实现了CountableIteratorAggregate接口。

$nb = count($selectQuery);
foreach ($selectQuery as $model) {
    // ...
}

选择查询允许您为Pagerfanta创建适配器。

use Pagerfanta\Pagerfanta;

$adapter = $selectQuery->createPagerfantaAdapter();
$pagerfanta = new Pagerfanta($adapter);

更新

您可以设置和增加字段。

$updateQuery->set('name', 'Pablo');
$updateQuery->inc('age', 1);

然后执行更新查询。

$updateQuery->execute();

删除

删除查询只能进行过滤和执行。

$removeQuery->execute();

流畅接口

所有查询都实现了流畅接口。

$articles = $molino->createSelectQuery('Model\Article')
    ->filterEqual('isActive', true)
    ->sort('createdAt', 'desc')
    ->limit(10)
    ->all()
;

Molino

Molino附带四个molino。

Mandango

用于与Mandango一起工作。

use Molino\Mandango\Molino;

$molino = new Molino($mandango);
$molino->getName() // mandango

Doctrine ORM

用于与Doctrine ORM一起工作。

use Molino\Doctrine\ORM\Molino;

$molino = new Molino($entityManager);
$molino->getName() // doctrine_orm

Doctrine MongoDB ODM

用于与Doctrine MongoDB ODM一起工作。

use Molino\Doctrine\ODM\MongoDB\Molino;

$molino = new Molino($documentManager);
$molino->getName() // doctrine_mongodb_odm

内存

用于测试。它不需要映射或访问数据库。

use Molino\Memory\Molino;

$molino = new Molino();
$molino->getName() // memory

事件

您可以选择使用molino的事件。为了做到这一点,您必须使用类EventMolino,它接收一个molino和一个事件分发器。您可以使用事件molino以常规方式使用,因为它也实现了MolinoInterface,它只是简单地包装一个molino以用于事件。

EventMolino依赖于Symfony2 EventDispatcher组件,因为它必须接收一个Symfony\Component\EventDispatcher\EventDispatcherInterface实例作为事件分发器。

use Molino\Mandango\Molino;
use Molino\EventMolino;
use Symfony\Component\EventDispatcher\EventDispatcher;

$eventDispatcher = new EventDispatcher();
$mandangoMolino = new Molino($mandango);
$molino = new EventMolino($mandangoMolino, $eventDispatcher);

// using the final molino in a normal way
$model = $molino->createSelectQuery('Model\Article')
    ->filterEqual('is_active', true)
    ->sort('created_at', 'desc')
    ->one()
;

事件类

使用了两种事件类。

  • Molino\Event\ModelEvent:用于具有模型的事件。
  • Molino\Event\QueryEvent:用于包含查询的事件。

您可以在两个类中访问molino

$molino = $modelEvent->getMolino();
$molino = $queryEvent->getMolino();

以及根据类访问模型或查询

$model = $modelEvent->getModel();
$modelEvent->setModel($model);

$query = $queryEvent->getQuery();
$queryEvent->setQuery($query);

事件

您可以使用的事件保存在类 Molino\Event\Events 中的常量中。它们是:

  • CREATE:在创建模型时。它使用一个 ModelEvent
  • PRE_SAVE:在保存模型之前。它使用一个 ModelEvent
  • POST_SAVE:在保存模型之后。它使用一个 ModelEvent
  • PRE_REFRESH:在刷新模型之前。它使用一个 ModelEvent
  • POST_REFRESH:在刷新模型之后。它使用一个 ModelEvent
  • PRE_DELETE:在删除模型之前。它使用一个 ModelEvent
  • POST_DELETE:在删除模型之后。它使用一个 ModelEvent
  • CREATE_QUERY:在创建任何查询(选择、更新、删除)时。它使用一个 QueryEvent

示例

在创建文章时自动将作者分配给文章

use Molino\Event\Events;
use Molino\Event\ModelEvent;
use Model\Article;

$author = get_author();

$eventDispather->addListener(Events::CREATE, function (ModelEvent $event) use ($author) {
    if ($event->getModel() instanceof Article) {
        $event->getModel()->setAuthor($author);
    }
});

通过作者过滤所有文章查询

use Molino\Event\Events;
use Molino\Event\QueryEvent;

$author = get_author();

$eventDispather->addListener(Events::CREATE_QUERY, function (QueryEvent $event) use ($author) {
    if ('Model\Article' === $event->getQuery()->getModelClass()) {
        $event->getQuery()->filterEqual('author_id', $author->getId());
    }
});

限制

您可以用Molino做很多事情,但正如您可能猜到的,您不能做所有事情,因为它的API很小(尽管它是这样的,以便与不同的后端兼容)。

无论如何,这并不意味着您不能做与不同后端兼容的复杂事情。您只需要通过区分后端来实施您无法直接使用Molino做的部分

if ('mandango' === $molino->getName()) {
    // Mandango implementation
} elseif ('doctrine_orm' === $molino->getName()) {
    // Doctrine ORM implementation
} else {
    throw new \RuntimeException('This application only works with the following molinos: "mandango", "doctrine_orm".');
}

作者

Pablo Díez - pablodip@gmail.com

许可协议

Molino遵循MIT许可协议。有关详细信息,请参阅LICENSE文件。