vespolina / molino
一个小巧快速库,用于创建与持久化后端无关的可重用工具。
Requires
- php: >=5.3.2
- symfony/event-dispatcher: *
Requires (Dev)
- doctrine/mongodb-odm: dev-master
- doctrine/orm: dev-master
- mandango/mandango: dev-master
- pagerfanta/pagerfanta: dev-master
This package is not auto-updated.
Last update: 2024-09-14 13:55:47 UTC
README
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();
选择查询实现了Countable
和IteratorAggregate
接口。
$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文件。