2

私は CodeIgniter を初めて使用し、複数のモデルで使用するこの関数を持っています。

// Returns TRUE if the array of values supplied
// each correspond to a column in the database table.
// Else returns the value of the bad column.
private function _columns_exist( $columns, $table ) {

    foreach( $columns as $key => $value ) {

        if( !$this->db->field_exists( $key, $table ) ) {

            return $key;

        }

    }

    return TRUE;

}

関数を一度書き、それを多くの異なるファイルから再利用する正しい方法と考えられるものは何ですか?

この 1 つの機能のためだけにライブラリ全体を作成しますか?

4

2 に答える 2

2

CodeIgniter のポイントは、基本的に 2 種類のカスタム関数があることです。ライブラリメソッドとしてライブラリに存在するものと、単純な関数としてヘルパーに存在するもの。

それらの違いは最小限であり、それらを保持する場所を決定するのはあなた次第ですが、ヘルパー関数はほとんどがスタンドアロンであり、ライブラリ メソッドはデータベース、セッション、その他のモデルなどの CI ライブラリを使用するメソッドであることがベスト プラクティスです。

関数の場合、ライブラリを作成してそこに保持するのが最善ですが、データベースのクエリを使いすぎていないため、ヘルパーを作成することもできます。私だったら、次のようなヘルパーを作成します。

helpersという名前のディレクトリにファイルを作成し、ファイル内のヘルパー配列にdb_helper.php要素を追加します。フルネームを書く必要はなく、 だけであることに注意してください。dbautoload.phpdb_helperdb

作成したファイルに次のコードを挿入しdb_helper.phpます。

<?php
if(!function_exists('_columns_exist')) {
    function _columns_exist( $columns, $table ) {
        $CI =& get_instance();
        foreach( $columns as $key => $value ) {
            if( !$CI->db->field_exists( $key, $table ) ) {
                return $key;
            }
        }
        return TRUE;
    }
}

これで、この関数をどこでも使用できます - コントローラ、モデル、ビュー ファイルでさえ、単純な関数であるかのように:

_columns_exist($columns, $table)

ヘルパーやライブラリでは使用しないことに注意してください$this。最初に CodeIgniter シングルトン オブジェクトのインスタンスを取得してから、それを操作する必要があります。詳細については、ユーザー ガイドまたは StackOverflow を参照してください。

darkdadの回答に対する私のコメントも参照してください。これは、私が求める別の優れたアプローチです。

于 2012-12-22T08:58:02.703 に答える
2

モデル間で共通の関数を使用している場合は、最初にコア モデルを拡張し、他のすべてのモデルにそれを拡張させることができます。コア クラスの拡張について詳しくは、http: //ellislab.com/codeigniter/user-guide/general/core_classes.htmlをご覧ください。

class MY_Model extends CI_Model {

  public function __construct()
  {
      parent::__construct();
  }

  public function common_func()
  {
    // content
  }
}

その後、他のすべてのモデルでこの機能を使用できます

class Some_model extends My_Model {

  public function __construct()
  {
      parent::__construct();
  }

  public function some_func()
  {
    // use the common function here
    $result = $this->common_func();
  }
}
于 2012-12-22T08:27:26.483 に答える