pablodip / molino
一个小巧且快速的库,用于创建可重用的工具,使持久层后端无关。
Requires
- php: >=5.3.2
This package is not auto-updated.
Last update: 2016-03-09 06:32:29 UTC
README
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();
选择查询实现了 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
事件
您可以选择使用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文件。