web-dev-qa-db-ja.com

PHP&Codeigniter-パラメータをモデルに渡す方法は?

次のコードを使用して、コントローラー内からモデルを初期化します。

$this->load->model('model_name');

モデルコンストラクターがパラメーターを受け取るように、上記の行を何らかの方法で変更することは可能ですか?モデルコンストラクターで次のコードを使用したいと思います。

function __construct($param_var) {
   parent::Model();

   $this->$param_var = $param_var; //I'm not even sure this works in PHP..but different issue
}

これは、モデルクラスを再利用できるようにするために非常に役立ちます。ありがとう。

更新:(回答の1つから、元の質問は解決されました。ありがとうございます!)これを実行したかった理由を説明するだけです。アイデアは、モデルクラスを再利用できるようにすることです。したがって、基本的に簡単な例を示すために、「order_by」変数をモデルクラスに渡して、モデルクラスのロジックを再利用できるようにします(SQLのorder-by値を動的に変更します)。別のクラスまたは別の関数を作成します。

これは貧弱なデザインですか?もしそうなら、なぜあなたがこのようなことをしないのか、そして代わりにどのようにそれをするのか説明していただけますか?

17
oym

これにはあなたの理由がわかりますが、データベースのニーズについては Object-Relational Mapping を検討することをお勧めします。私が最近使用している DataMapper というCodeIgniter用のユーザー作成のORMライブラリがあります。コントローラのテーブルをオブジェクトとして使用できますが、問題により適している場合があります。

3
Domenic

load関数を介してパラメーターを渡すことはできません。次のようなことをする必要があります。

_$this->load->model('model_name');
$this->model_name->my_constructor('stuff');
_

モデル内:

_function my_constructor($param_var) {
...
}
_

更新への応答:

モデル関数を呼び出すときに、order_by値を渡すだけで済みます。コントローラーのアクションでは、$this->model_name->get($my_id);のようなものがあると想定しています。order_byパラメーターをこの関数に追加するだけです。 IMOを使用すると、モデルロジックがより柔軟になり、再利用できるようになります。これは、コンストラクターでorder_byを設定すると、すべての関数のorder_by値が設定されると想定しているためです。

23
jimyi

DataMapper を使用する代わりに、 IgnitedRecord を使用することをお勧めします。これは、DataMapperが維持されなくなったため、Rubyに置き換えられたためです。

1
vinothvetrivel

モデル

<?php

/* Load Model core model */
/* BASEPATH = D:\xampp\htdocs\ci_name_project\system\ */
include BASEPATH . 'core\\Model.php';

class User_model extends CI_Model {

    /* Properties */
    private $name;


    /* Constructor parameter overload */
    public function __construct($name) {
        $this->set_name($name);
    }    


    /* Set */
    public function set_name($name) {
        $this->name = $name;
    }


    /* Get */
    public function get_name() {
        return $this->name;
    }

}

コントローラー

<?php

class User_controller extends CI_Controller {

    public function index() {

        /* Load User_model model */
        /* APPPATH = D:\xampp\htdocs\ci_name_project\application\ */
        include APPPATH . 'models\\User_model.php';

        $name = 'love';

        /* Create $object_user object of User_model class */
        $object_user = new User_model($name);     

        echo $object_user->get_name(); // love

    }

}
1
antelove