我希望使用 Lithium 框架来构建我的应用程序配置界面,因为我喜欢它的最小方法和以文档存储(即 Mongodb)为中心的模型。
但是,(我知道它还没有完全发布),几乎没有信息、教程或示例可以让您从简单的博客教程继续前进。
我现在要做的是构建一个应用程序,它将向我展示我在 Mongodb 中拥有的集合,然后让我使用我选择的任何集合。我似乎无法弄清楚:
a)我将如何构建一个枚举集合的模型 - 最好根据我的内部命名方案,
b)我如何打破约定模型,以便我可以指定要使用的集合的名称?
我认为有两件事我正在努力回答这两个问题 - 也许是对如何在 MVC 中移动模型超出简单的集合-模型-控制器-视图示例的基本误解,其次,告诉的实际过程mongo 数据源使用什么集合。
任何指针或例子,感激地收到。
克里斯
更新::
所以我想出了如何设置集合 - 作为参考,您可以在 $_meta 数组中设置源,如下所示:
protected $_meta = array(
'source' => '<<collectionName>>'
);
仍然不知道如何使用一个模型来列出我在我的数据库中拥有的所有集合。任何想法如何从哲学和技术的方式做到这一点?
进一步更新:
所以感谢下面的评论,我得到了进一步的帮助。至少我现在可以重新表述一下这个问题。我可以像这样定义我的模型:
<?php
namespace app\models;
use lithium\data\Model;
class Posts extends \lithium\data\Model{
protected $_meta = array('source' => false);
public function testcolls(){
return (self::connection()->sources());
}
}
?>
那么在我看来,我可以使用:
<?php foreach ($post->testcolls() as $coll): ?>
<h2><?=$coll ?></h2>
<?php endforeach; ?>
这行得通 - 但是,我真正想做的不是在我的模型中创建一个“testcolls”方法,而是正如 Medhi 下面建议的那样,我需要覆盖 find 方法。我似乎无法弄清楚如何做到这一点以及它需要返回什么。文档对此并不太清楚。
最终更新
基于下面的评论和一些实验,我想出了以下方法,可以使用集合作为参数调用 find 。
模型:
class Dataqueues extends \lithium\data\Model{
protected $_meta = array('source' => false);
public static function find($filter, array $options = array()) {
if (isset($options['collection'])){
self::meta('source', $options['collection']);
}
return parent::find('all',$options);
}
}
控制器:
class DataqueuesController extends \lithium\action\Controller {
public function index() {
$dataqueues = Dataqueues::find('all',array('limit'=>20,'collection'=>'W501'));
return compact('dataqueues');
}
}
最后得到一个返回集合列表的模型也很简单:
class Collections extends \lithium\data\Model{
protected $_meta = array('source' => false);
public static function find($filter, array $options = array()) {
return self::connection()->sources();
}
}
请注意,控制器不支持选项或过滤器。