2

CodeIgniterユーザーガイドでは、サンプルモデルには、対応するデータベーステーブルの各フィールドの属性がありました。

    class Blogmodel extends CI_Model {

        var $title   = '';
        var $content = '';
        var $date    = '';
        //...

ただし、ブログ投稿のセットを返す場合、それらは一般的なオブジェクトにすぎません。

    function get_last_ten_entries()
    {
        $query = $this->db->get('entries', 10);
        return $query->result();
    }

各ブログ投稿が一般的なオブジェクトのみになる場合、クラスの最初の属性の目的は何ですか?

各ブログ投稿を、そのコンテンツが入力された本格的なモデルオブジェクトとして用意しておくと便利なようです。次に、内部で値をフェッチするメソッドを記述できます。ただし、ユーザーガイドのすべての例は、各コントローラーが各モデルの1つのインスタンスを持ち、そのオブジェクトを使用してデータベース値を含む汎用オブジェクトをフェッチすることを示しているようです。さらに、例がモデルをインスタンス化する方法($this->load->model('Blog');)は、コントローラー内にモデルのインスタンスが1つだけあると予想されることは明らかです。

私のブログ投稿にstatus整数としてデータベースに保存されている値がありますが、いくつかの異なるコントローラーでその値を人間が読める文字列として表示したい場合、その関数/メソッドをどこに配置しますか?複数のコントローラーで必要であり、1つのオブジェクトに固有であるため、モデルオブジェクトのメソッドである必要があると思います。各ブログ投稿がモデルのインスタンスである場合、次のように書くことができます。

    function get_human_status()
    {
        $lookup = array(
            1 => 'Active',
            2 => 'Hidden',
            3 => 'Pending');
        return $lookup[$this->status];
    }

ただし、各ブログ投稿が汎用オブジェクトである場合は、次のようになります。

    function get_human_status($data)
    {
        $lookup = array(
            1 => 'Active',
            2 => 'Hidden',
            3 => 'Pending');
        return $lookup[$data->status];
    }

CodeIgniterの慣用句はどちらですか?2番目だとすると、サンプルモデルがこれらの内部属性を定義するのはなぜですか?

最後に、ボーナスポイントについて、この種の他の質問がある場合、どの本、記事、または例を見る必要がありますか?

4

1 に答える 1

6

ええと..「CodeIgniter」という名前で呼ばれる災害。

そのひどいフレームワークのドキュメントでは、「モデル」をアクティブなレコードパターンを実装するインスタンスとして描写しています。これが、そのクラスの定義で無意味な属性を取得する理由です。これは、AR パターン内の 2 つの責任 (ストレージとロジック) の間の競合のもう 1 つの副作用です。varまた、 PHP4 のアーティファクトであるキーワードに気付くかもしれません。

あなたが「モデル」と呼ぶものはそうではありません。これらは単純なドメイン オブジェクトであり、後でモデルの一部になります。モデル レイヤーは、MVC デザイン パターンの他のレイヤーであるプレゼンテーション レイヤーと同様に、精神的な構成要素です。

この$this->load->model()メソッドは、「モデル」インスタンスを初期化しません。これは、CodeIgniter が適切なオートローダーを欠いている別の例です。Blogこのメソッドは、クラスを含むファイルをインクルードするためだけに存在します。したがって、「ブログ」が特異なオブジェクトであると結論付けることはできません。

コントローラーは、何も「表示」することは想定されていません。現在のビュー インスタンスとモデル レイヤーの状態を変更するためのものがあります。ビューは、何かを表示する方法と使用するテンプレートを選択するプレゼンテーション ロジックを処理することになっています。ビューは愚かなテンプレートであってはなりません。

教材に関しては、この投稿の最後に失われた講義と本があります。thisthisも多少関連しているかもしれません。

于 2012-08-11T22:57:18.390 に答える