CIフレームワークサポートサービス層、CIフレームワークサービス層の作り方
CodeIgniter フレームワーク MVC が階層化されていることは誰もが知っています。通常、ビジネス ロジックはコントローラーに書き込まれますが、モデルはデータベースの処理のみを担当します。
しかし、ビジネスがますます複雑になるにつれて、コントローラーはますます肥大化します。たとえば、ユーザーが注文を行う場合、ショッピング カートの更新、追加という一連の操作が必然的に発生します。さらに、このようなコードをコントローラーに配置すると、注文のプロセスが膨大になり、再利用が困難になります。永続化層とビジネス層は結合されます。現在の会社のプロジェクトは、多くの人がビジネス ロジックをモデルに記述し、そのモデルが他のモデルを調整する、つまりビジネス層と永続化層が相互に結合するというものです。これは非常に不合理であり、モデルの保守が困難になり、メソッドの再利用が困難になります。
ビジネス ロジックを担当するコントローラーとモデルにビジネス層サービスを追加することを検討できますか。カプセル化された呼び出しインターフェイスはコントローラーで再利用できます。
このようにして、各層のタスクが明確になります:
モデル (DAO): データ永続層の作業とデータベース上の操作はすべてここにカプセル化されています。
サービス: ビジネス ロジック層は、ビジネス モジュールの論理アプリケーション設計を担当します。サービス インターフェイスは、特定のビジネス実装を設計する際に、ビジネス ロジック処理を実装するためにコントローラーで呼び出すことができます。モデルインターフェイスが呼び出されます。
コントローラー: 特定のビジネス プロセス制御を担当するコントロール層。ここでは、データをビューに返すためにサービス層が呼び出されます
。
ビュー: フロントエンドのページ表示を担当し、コントローラーと密接に連携します。
上記の説明に基づく、実装プロセスは次のとおりです:
(1) CI にサービスをロードできるようにする サービスディレクトリは application 配下に配置します。 CI システムにはサービスがないため、application/core 配下に新しい拡張子 MY_Service.php を作成します。
コードをコピーします コードは次のとおりです:
クラスMY_サービス
{
パブリック関数 __construct()
{
log_message('debug', "サービスクラスが初期化されました");
}
関数 __get($key)
{
$CI = & get_instance();
return $CI->$key;
}
}
(2) CI_Loader 実装を拡張し、サービスをロードし、application/core の下に新しい MY_Loader.php ファイルを作成します。
コードをコピーします
コードは次のとおりです:
クラス MY_Loader は CI_Loader を拡張します
{
/**
* ロードされているサービスのリスト
*
* @var 配列
* @access protected
*/
protected $_ci_services = array();
/**
* サービスをロードするパスのリスト
*
* @var 配列
* @access protected
*/
protected $_ci_service_paths = array();
/**
* コンストラクター
*
* サービスファイルへのパスを設定します
*/
パブリック関数 __construct()
{
親::__construct();
$this->_ci_service_paths = array(APPPATH);
}
/**
* サービスローダー
*
* この関数を使用すると、ユーザーはクラスをロードしてインスタンス化できます。
※ユーザーのアプリコントローラーから呼び出されるように設計されています
*
* @param string クラスの名前
* @param オプションのパラメータを組み合わせました
* @param string オプションのオブジェクト名
* @return void
*/
パブリック関数サービス($service = '', $params = NULL, $object_name = NULL)
{
if(is_array($service))
{
foreach($service as $class)
{
$this->service($class, $params);
}
戻ります;
}
if($service == '' または isset($this->_ci_services[$service])) {
FALSE を返します;
}
if(! is_null($params) && ! is_array($params)) {
$params = NULL;
}
$subdir = '';
// サービスはサブフォルダーにありますか?その場合は、ファイル名とパスを解析してください。
if (($last_slash = strrpos($service, '/')) !== FALSE)
{
// パスは最後のスラッシュの前にあります
$subdir = substr($service, 0, $last_slash + 1);
// そしてその背後にあるサービス名
$service = substr($service, $last_slash + 1);
}
foreach($this->_ci_service_paths as $path)
{
$filepath = $path .'service/'.$subdir.$service.'.php';
if ( ! file_exists($filepath))
{
続けます;
}
include_once($filepath);
$service = strto lower($service);
if (空($object_name))
{
$object_name = $service;
}
$service = ucfirst($service);
$CI = &get_instance();
if($params !== NULL)
{
$CI->$object_name = new $service($params);
}
その他
{
$CI->$object_name = 新しい $service();
}
$this->_ci_services[] = $object_name;
戻る;
}
}
}
(3) 簡単な実装例:
コントローラーでサービスを呼び出します:
コードをコピーします コードは次のとおりです:
クラス ユーザーが CI_Controller を拡張します
{
パブリック関数 __construct()
{
親::__construct();
$this->load->service('user_service');
}
パブリック関数login()
{
$name = 'phpddt.com';
$psw = 'パスワード';
print_r($this->user_service->login($name, $psw));
}
}
サービス中のコールモデル:
コードをコピーします コードは次のとおりです:
クラス User_service は MY_Service を拡張します
{
パブリック関数 __construct()
{
親::__construct();
$this->load->model('user_model');
}
パブリック関数ログイン($name, $password)
{
$user = $this->user_model->get_user_by_where($name, $password);
//....
//....
//....
return $user;
}
}
モデルではdb:
のみを扱います
コードをコピーします コードは次のとおりです:
クラス User_model は CI_Model を拡張します
{
パブリック関数 __construct()
{
親::__construct();
}
パブリック関数 get_user_by_where($name, $password)
{
//$this->db
//......
//......
return array('id' => 1, 'name' => 'mckee');
}
}
基本的な実装アイデアは次のとおりです。
それにはすべて練習が必要であり、浅いところから深いところへ進めなければなりません。進捗管理システムやコミュニティなど、人々が開発した単純な CI 機能を探すことをお勧めします。システム内のライブラリとヘルパーを見て、CI の基本的な機能を理解してから、コア フォルダーにアクセスしてみてください。 . 以下のコアファイルを使用できるようになります。
NB CI がどのようなものであっても、PHP の読み込みファイルはすべて、たとえば include です。あまり深く考えずに、単純に開始してください。
http://www.bkjia.com/PHPjc/902774.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/902774.html技術記事 CI フレームワークにサービス層をサポートさせる方法 CI フレームワークのサービス層が CodeIgniter フレームワーク MVC に階層化されており、モデルはデータベースとの通信のみを担当することは誰もが知っています。