pablodip/molino

此包已被弃用且不再维护。未建议替代包。

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

dev-master 2012-07-10 14:48 UTC

This package is not auto-updated.

Last update: 2016-03-09 06:32:29 UTC


README

Build Status

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

Molino 不提供用于定义模型的任何内容。这意味着您必须以常规方式定义与后端交互所需的模型。

使用方法

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

$molino = new Molino();

名称

每个 molino 都必须有一个名称

$name = $molino->getName();

创建模型

您可以使用 createModel 方法创建模型,第一个参数为模型类

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

设置和获取数据

由于使用设置器和获取器是当前的惯例,Molino 不包括任何用于抽象此功能的方法。因此,您可以使用常规方式使用模型中的设置器和获取器。

$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

事件

您可以选择使用molinos事件。为了做到这一点,您必须使用类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文件。