3

我希望使用 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();
    }   
}

请注意,控制器不支持选项或过滤器。

4

2 回答 2

3

没有什么可以阻止您拥有一个Collections模型,您可以在其中设置$_meta['source'] = false以防止 Lithium 在名为集合的数据库中查找集合。

在这个模型中,你可以调用YourModel::connection()->sources()来列出你所有的 Mongo Collections。
sources() 的文档:http: //li3.me/docs/lithium/data/source/MongoDb::sources()。基本上它调用listCollections()MongoDB 实例http://php.net/manual/en/mongodb.listcollections.php

您可以覆盖您的 Model::find() 方法以返回集合列表,而不是文档列表,或者将集合作为参数传递Collections::find('all', array('conditions' => ..., 'collection' => 'foo'))......或者你想要的任何东西:-)

锂的设计不会对您施加太大压力!

于 2012-04-23T11:31:21.417 回答
0

首先,Lithium 遵循约定优于配置的方法。

这意味着什么:

配置:'source' => '<< collectionName >>'

约定:将您的模型和集合命名为相同的东西,框架处理其余部分。
IE:“人”集合将具有“人”模型

其次,连接到您的数据库:

在 app\bootstrap\connections.php 中配置您的 connections.php 文件。我知道我说的是约定优于配置,但你仍然需要让框架知道数据库在哪里以及登录信息是什么。有关详细信息,请查看 http://li3.me/docs/manual/quickstart。以下是相关代码:

// MongoDB Connection
Connections::add('default', array('type' =>  'MongoDb', 'database' => 'blog', 'host' => 'localhost'));

第三,获取数据
创建一个模型,匹配你的集合名称,然后在你的控制器中,添加这一行:

$model = Models::all();

其中 model 是您存储在集合中的单数名称,Models 是您的模型的名称。就是这样
如果您在此行之后放置一个断点,您将看到您的模型集合。有关更多信息,请参阅http://li3.me/docs/manual/working-with-data/using-models.wiki

最后,要将它传递给您的视图,只需将这行代码放在控制器的末尾:

return compact('model', 'model2', 'model3');

其中 model 将是您在第三步中刚刚提取的内容。我添加的模型 2 和模型 3 是您将如何传递您提取的任何其他集合的方式。

在您看来,您只需引用 $model 并假设相关字段就在那里。您不必担心放置 getter 或 setter 或其他类似的东西。例如:如果要显示 $model 中的数据:

foreach ($model as $aModel) {
    echo $aModel;
}

请参阅访问视图变量: http: //li3.me/docs/manual/handling-http-requests/views.wiki

希望这可以帮助。

于 2012-04-23T03:18:50.407 回答