如何使用带有枚举列表的集合和模型中更改集合的Lithium PHP框架

时间:2012-04-22 19:43:16

标签: php mongodb lithium

我希望使用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方法。我似乎无法弄清楚如何做到这一点以及它需要返回什么。文档对此不太清楚。

最终更新

根据下面的评论和一些实验,我想出了以下内容,可以将查询作为参数调用。

模型:

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();
    }   
}

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

2 个答案:

答案 0 :(得分:3)

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

在此模型中,您可以调用YourModel::connection()->sources()列出所有Mongo收藏集 来源文件():http://li3.me/docs/lithium/data/source/MongoDb::sources()。基本上它在MongoDB实例http://php.net/manual/en/mongodb.listcollections.php

上调用listCollections()

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

锂的设计不会给你太多力量!

答案 1 :(得分:0)

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

这意味着什么:

配置:'source'=&gt; “&LT;&LT; collectionName&gt;&gt;'

约定:将您的模型和您的集合命名为相同的东西,框架处理其余部分 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是模型的名称。 就是这样 如果你在这一行之后放置一个断点,你会看到你的Models系列。有关详细信息,请参阅http://li3.me/docs/manual/working-with-data/using-models.wiki

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

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

模型将是您在第三步中提取的内容。我提到的模型2和3是你如何通过你拉的任何其他系列。

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

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

请参阅:http://li3.me/docs/manual/handling-http-requests/views.wiki

中的访问视图变量

希望这有帮助。