2012-04-07 12 views
0

私は、CodeIgniterでさまざまな基準(たとえば、著者、タイトル、出版者など)に基づいて検索できるライブラリ検索エンジンを作成しています。だから、私は、私は彼クラスAuthorSearch CodeIgniterモデルを使用したOOP抽象化

class AuthorSearch implements BookSearch extends CI_Model{ 

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

public function search($authorname){ 
    //Implement search function here... 
    //Return query result which we can display via foreach 
} 
} 

として今書くことができます著者に基づいて検索を実装する場合は、データベースを検索するための責任のすべてのクラスが

interface BookSearch{ 
/** 
Returns all the books based on a given criteria as a query result. 
*/ 
public function search($search_query); 
} 

を実装しますBookSearchたインターフェースを定義し私はコントローラを定義してこれらのクラスを使用し、結果を表示します。

class Search extends CI_Controller{ 

/** 
These constants will contain the class names of the models 
which will carry out the search. Pass as $search_method. 
*/ 
const AUTHOR = "AuthorSearch"; 
const TITLE = "TitleSearch"; 
const PUBLISHER = "PublisherSearch"; 

public function display($search_method, $search_query){ 
    $this->load->model($search_method); 
} 
} 

これは私が問題に当たった場所です。 CodeIgniterのマニュアルには、モデル内のメソッド(つまりsearch)を呼び出すために、私は$this->AuthorSearch->search($search_query)と書いています。しかし、私は文字列として検索クラスのクラス名を持っているので、私は実際に$this->$search_method->search($search_query)を行うことはできません?

これがJavaの場合は、オブジェクトを定数にロードします。 PHP5にはヒントがありますが、このプロジェクトのターゲットプラットフォームにはPHP4が含まれています。また、私はこの抽象化を行うための「CodeIgniter」の方法を探しています。何かヒント?

答えて

1

あなたは本当に$this->$search_method->search($search_query)を行うことができます。またCIでは、必要に応じてライブラリ名を割り当てることができます。

public function display($search_method, $search_query){ 
    $this->load->model($search_method, 'currentSearchModel'); 
    $this->currentSearchModel->search($search_query); 
} 
1

あなたはそれをドライバーモデルといいますか。あなたは、実際には、あなたが行うことはできません示唆しているものを行うことができます。

<?php 
$this->{$search_method}->search($search_query); 

CodeIgniterではこれを行うにはCI_Driver_Library & CI_Driverクラスを(CodeIgniter Driversを参照)があります。

しかし、私はあなたがやっているように、インターフェイスを実装したり、抽象クラスを拡張したりする方が簡単だと分かっています。継承はCIのドライバよりも優れています。

関連する問題