ホームページ  >  記事  >  バックエンド開発  >  CI フレームワークでサービス層をサポートする方法、CI フレームワークのサービス層_PHP チュートリアル

CI フレームワークでサービス層をサポートする方法、CI フレームワークのサービス層_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:15:45905ブラウズ

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 機能を探すことをお勧めします。システム内のライブラリとヘルパーを見て、CI の基本的な機能を理解してから、コア フォルダーにアクセスしてみてください。 . 以下のコアファイルを使用できるようになります。

CIフレームワークにカスタムデータ構造をロードする方法

NB CI がどのようなものであっても、PHP の読み込みファイルはすべて、たとえば include です。あまり深く考えずに、単純に開始してください。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/902774.html技術記事 CI フレームワークにサービス層をサポートさせる方法 CI フレームワークのサービス層が CodeIgniter フレームワーク MVC に階層化されており、モデルはデータベースとの通信のみを担当することは誰もが知っています。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。