3

最小限のアプローチとドキュメントストア(つまりMongodb)中心のモデルが好きなので、Lithiumフレームワークを使用してアプリケーション構成インターフェイスを構築したいと考えています。

ただし(まだ完全にはリリースされていないことはわかっていますが)、簡単なブログチュートリアルから先に進むための情報、チュートリアル、または例はほとんどありません。

私が今やろうとしているのは、Mongodbにあるコレクションを表示するアプリを作成してから、選択したコレクションを操作できるようにすることです。私は理解できないようです:

a)コレクションを列挙するモデルをどのように構築しますか?できれば内部の命名スキームに従って、

b)使用するコレクションの名前を指定できるように、従来のモデルを破るにはどうすればよいですか?

これらの2つの質問に答えるために私が苦労していることが2つあると思います-おそらく、MVCでモデルを単純なcollection-model-controller-viewの例を超えて移動する方法の根本的な誤解、そして次に、 mongodatasource使用するコレクション。

感謝の気持ちを込めて受け取ったポインタや例。

クリス

アップデート::

そこで、コレクションを設定する方法を理解しました。参考までに、次のように$_meta配列にソースを設定できます。

protected $_meta = array(
    'source' => '<<collectionName>>'
);

ただし、DBにあるすべてのコレクションを一覧表示するモデルの使用方法はまだわかりません。哲学的かつ技術的な方法からそれを行う方法について何かアイデアはありますか?

さらなる更新::

だから私は以下のコメントのおかげでもう少し得ました。少なくとも、質問を少し言い換えることができるかもしれません。モデルを次のように定義できます。

<?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

Lithiumがコレクションという名前のデータベースでコレクションを検索しないようCollectionsに設定したモデルを使用することを妨げるものは何もありません。$_meta['source'] = false

このモデルでは、呼び出しYourModel::connection()->sources()てすべてのMongoコレクションを一覧表示できます。
sources()のドキュメント:http://li3.me/docs/lithium/data/source/MongoDb :: sources()。基本的listCollections()に、MongoDBインスタンスを呼び出しますhttp://php.net/manual/en/mongodb.listcollections.php

Model :: find()メソッドをオーバーライドして、ドキュメントのリストではなくコレクションのリストを返すか、コレクションをparam Collections::find('all', array('conditions' => ..., 'collection' => 'foo'))...または必要なものとして渡すことができます:-)

リチウムはあなたにそれほど強い力を与えないように設計されています!

于 2012-04-23T11:31:21.417 に答える
0

まず第一に、Lithium は構成アプローチよりも規則に従います。

これが意味すること:

構成: 'ソース' => '<< コレクション名 >>'

慣例: モデルとコレクションに同じ名前を付けます。残りはフレームワークが処理します。
IE: "People" コレクションには "People" モデルがあります

次に、データベースに接続します。

app\bootstrap\connections.php で connections.php ファイルを構成します。構成よりも慣習だと言いましたが、データベースがどこにあり、ログイン情報が何であるかをフレームワークに知らせる必要があります。詳細については、 http://li3.me/docs/manual/quickstartを参照してください。関連するコードは次のとおりです。

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

3 番目に、データを取得
する コレクション名に一致するモデルを作成し、コントローラーに次の行を追加します。

$model = Models::all();

ここで、model はコレクションに保存するものの単数形の名前で、Models はモデルの名前です。それだけです。
この行の後にブレーク ポイントを置くと、Models コレクションが表示されます。詳細については、http://li3.me/docs/manual/working-with-data/using-models.wikiを参照してください。

最後に、それをビューに渡すには、コントローラーの最後に次のコード行を追加します。

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

ここで、model は 3 番目のステップで取得したものになります。私が追加したモデル 2 と 3 は、プルした他のコレクションを渡す方法です。

ビューでは、$model を参照するだけで、関連するフィールドがそこにあると想定できます。ゲッターやセッターなどを配置することについて心配する必要はありません。例: $model のデータを表示する場合:

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

次のビュー変数へのアクセスを参照してください: http://li3.me/docs/manual/handling-http-requests/views.wiki

お役に立てれば。

于 2012-04-23T03:18:50.407 に答える