0

私が尋ねようとしているのと同じ質問に非常に近いいくつかの投稿を読みましたが、まだMVCの方法を理解していません。1 つの例は、「2 つのテーブルに対する Codeigniter db クエリ」というタイトルの近いものでしたが、オブジェクトを適切に呼び出していないという事実を補強する「未定義のプロパティ」エラーが発生しています。単純に DataMapper を使用したくないのは、外に出て追加のクラスを取得する必要がある場合、手続き型のコーディング ルートに戻る可能性があるからです。このフレームワークの実装がどのように機能するかを理解することに少し興奮しました。

私は 2 つのテーブルを持っています。一方を「アプリ」と呼び、もう一方を「マッピング」と呼びましょう。「アプリ」とは、次のようなリバース プロキシ構成として apache を使用するアプリケーションです: ProxyPass /mapping/ https:/// ProxyPassReverse /mapping/ https:///

一部のアプリは複数のリバース プロキシ マッピングを要求する可能性があるため、1 対多の設計になっています。

私の目的は、apps テーブルに select ステートメントを使用し、そのテーブルから必要なすべての列を出力することです。 、そしてもう一方には1つがあります。apps テーブルのデータの下にある prxypass 行は、apps_mapping テーブルからのものです。

App: App ABC
Owner: ABC Team
Date Requested: 2013-10-27
ProxyPass /ABC-Resource/ https://<to-some-internal-URL>/
ProxyPassReverse /ABC-resource/ https://<to-some-internal-URL>/

App: App XYZ
Owner: XYZ Team
Date Requested: 2013-10-27
ProxyPass /XYZ-mapping/ https://<to-some-internal-URL>/
ProxyPassReverse /XYZ-mapping/ https://<to-some-internal-URL2>/
ProxyPass /anothermapp/ https://<to-some-internal-URL>/
ProxyPassReverse /anothermapping/ https://<to-some-internal-URL2>/

user_guide の CodeIgniter の例で提供されているチュートリアルを変更することで、CodeIgniter を使用する最初の試みをモデル化しようとしました。

今私が持っているものです。モデル クラス:

<?php
class Prp_model extends CI_Model {


        public function __construct()
        {
                $this->load->database();
        }

//GET APP THE ROWs FROM THE apps TABLE
        public function get_appsUsingPrp()
        {
                $query = $this->db->get('apps');
                return $query->result_array();

        }

//GET THE MAPPINGS FROM THE apps_mappings TABLE
//FOR EACH APP BY WAY OF UNIQUE id IN THE appsTABLE
        public function get_prpMappings($id = FALSE)
        {
                $query = $this->db->get_where('apps_mappings', array('resourceID' => $id));
                return $query->result_array();
        }
?>

上記のクラスの場合、get_prpMappings() で return 関数を使用する代わりに、変数に入れる必要がありますか? それでも、int he views page というコードで $id の値を指定するにはどうすればよいでしょうか。

コントローラ クラス

<?php
class Prp extends CI_Controller {

        public function __construct()
        {
                parent::__construct();
                $this->load->model('prp_model');
        }

        public function index()
        {
                $data['apps'] = $this->prp_model->get_prp();
                $data['mappings'] = $this->prp_model->get_prpMappings($id);
                $data['title'] = 'PRP archive';
                $this->load->view('templates/header', $data);
                $this->load->view('prp/index', $data);
                $this->load->view('templates/footer');

        }

        public function view($id)
        {
                $data['apps'] = $this->prp_model->get_prp();
                $data['mappings'] = $this->prp_model->get_prpMappings($id);
        }


}

意見

<?php
    print_r($apps);
    print_r($mappings);

    foreach ($apps as $details): ?>

        <div id="main">
            <ul>
             <?php echo "<li>App Name: ".$details['app_name'] ?>
             <?php echo "<li>EPRID: ".$details['EPRID'] ?>
             <?php echo "<li>Requestor: ".$details['requestor'] ?>
             <?php echo "<li>Team PDL: ".$details['PDL'] ?>

                    <?php foreach ($mappings as $map): ?>
                    <?php echo "<li>ProxyPass /".$map['resource']."/ ".$map['destURL'] ?>
            <?php echo "<li>ProxyPassReverse /".$map['resource']."/ ".$map['destURL'] ?>
                    <?php endforeach ?>

            </ul>

        </div>
        <hr />




<?php endforeach ?>

?>

私の混乱に取り掛かります.... DataMapperクラスをセットアップしない場合、モデルおよび/またはコントローラークラスですべてのforeachループを実行する必要がありますか?

モデルクラスで定義された get_prpMappings($id) 関数をビューで直接呼び出す方法はありますか? その関数が機能する唯一の方法は、行を反復処理するときにアプリ行の ID が提供される場合です。

$this->prp_model->get_prpMappings($id); を入れてみました。ビューにはありますが、ビューページはクラスを識別していないようです。

最後に.. 見る限り、フレームワーク (CodeIgniter や Zend など) を使用してより多くのコーディングを行っているように見えます。しかし、フレームワークは、追加のコーディングの利便性を提供するものであるという印象を受けています。私はそれを見ていません。助けてください。

更新しました!私はこれを理解することを願っています。

ロジックを変更して、必要な出力を表現しました。非効率な方法でしたら教えていただけないでしょうか?ロジックは次のとおりです。 モデル クラス:

<?php
class Prp_model extends CI_Model {


        public function __construct()
        {
                $this->load->database();
        }

//GET APP THE ROWs FROM THE sharedITG TABLE
        public function get_appsUsingPrp()
        {
                $query = $this->db->get('sharedITG');
                return $query->result_array();

        }

//GET THE MAPPINGS FROM THE sharedITG_mappings TABLE
//FOR EACH APP BY WAY OF UNIQUE id IN THE shareITG TABLE
        public function get_prpMappings($id = FALSE)
        {
                $this->db->select('resourceID, resource, destURL');
                $query = $this->db->get_where('sharedITG_mappings', array('resourceID' => $id));
                return $query->result_array();
        }

        public function get_prp()
        {

                //loop through all apps
                foreach ($this->get_appsUsingPrp() as $app)
                {
                        //print_r($app);
                        foreach ($this->get_prpMappings($app['id']) as $mappings)
                        {
                                 $map[] = $mappings;
                        }

                }
                return $map;
        }
}

コントローラ クラス

<?php
class Prp extends CI_Controller {

        public function __construct()
        {
                parent::__construct();
                $this->load->model('prp_model');
        }

        public function index()
        {
                $data['mappings'] = $this->prp_model->get_prp();
                $data['apps'] = $this->prp_model->get_appsUsingPrp();
                $data['title'] = 'PRP archive';
                $this->load->view('templates/header', $data);
                $this->load->view('prp/index', $data);
                $this->load->view('templates/footer');

        }

        public function view($id)
        {
                $data['apps'] = $this->prp_model->get_appsUsingPrp();
                $data['mappings'] = $this->prp_model->get_prp();

        }

}

ビューコード:

<?php
//print_r($apps);
//print_r($mappings);

foreach ($apps as $details): ?>

    <div id="main">
        <ul>
         <?php echo "<li>App Name: ".$details['app_name'] ?>
         <?php echo "<li>EPRID: ".$details['EPRID'] ?>
         <?php echo "<li>Requestor: ".$details['requestor'] ?>
         <?php echo "<li>Team PDL: ".$details['PDL'] ?>

        <?php
                foreach ($mappings as $map)
                {
                        if ($details['id'] == $map['resourceID'])
                        {
                                echo "<li>ProxyPass /".$map['resource']."/ ".$map['destURL'];
                                echo "<li>ProxyPassReverse /".$map['resource']."/ ".$map['destURL'];
                        }
                }

        ?>
        </ul>

    </div>
<hr />

<?php endforeach ?>
4

1 に答える 1

1

それで、さらに調査した結果、かなりまともな例を示してくれるフォーラムを見つけました。これが最も最適な方法かどうかはわかりませんが、私にとってはうまくいき、コードイグナイターの MVC モデルを (ある程度) 維持しています。以下の関数の foreach は、私が追加したものです。現在の結果をループして、Table2ID と IDFromTable の間に関係がある 2 番目のテーブルのすべての行を取得しているようです。次に、$result{$key} を介して結果を追加します。

public function get_resuts()
    {

            $query = $this->db->get('table1');

            $result = $query->result_array();

            foreach ( $result as $key => $row )
            {

                    $query = $this->db->get_where('Table2', array('Table2ID' => $row['IDFromTable']));
                    $row['DesiredFieldFromTable@'] = $query->result_array();
                    $result[$key] = $row;
            }

            return $result;
    }

次に、get_resuts() 関数で foreach の結果からのコンテンツを使用して 2 番目の配列をループすることにより、ビューで使用できます。これを行う他の方法についても学ぶことに興味があります。

于 2013-12-21T13:47:36.093 に答える