この投稿では、フレームワークが開発者に課している制限を回避しながら、その機能を活用する機会を残していく方法について説明します。
問題
ソーシャルネットワークにクロスポストするためのリソースを開発しています。 当初、この製品はVkontakteとFacebookのみを対象としており、APIを操作するために1つのコントローラーと1つのモデルが割り当てられ、さらにcURLを操作するためのモデルが割り当てられていました。 ソーシャルネットワークを2つだけ使用する必要がありましたが、このプロジェクトのこのクラス構造は憂鬱に見えませんでした。 しかし、さらにいくつかのソーシャルサービスで作業を追加する価値がありました。 ネットワークでは、このようなモデルは、APIを使用する側とクライアント側の両方で混乱と完全な混乱につながることが明らかになりました。 ソーシャルネットワークにメッセージを送信するためのユーザーデータまたは10のajaxリクエストを表示する場合、他の10個から分岐するのにかかる費用はいくらですか。 Factoryパターンを使用して、このすべての恐怖をリファクタリングすることが決定されました。 すべてがシンプルに見えました。APIを操作するための共通の機能を備えたインターフェイスを記述し、ファクトリクラスと、ファクトリクラスを要求する唯一のコントローラを作成します。 しかし、彼らが機能を新しいパラダイムに移行し始めるとすぐに、それは私たちに思いつきました。 データベース、ユーザーデータ、ログ、およびhttpsでのすべての作業は、CIモデルとライブラリに基づいています。 それから、CodeIgniterが開発者に制限を課していない-課しているとしても、授業で書いたとき、自分がどれほど間違っているのかに気付きました。 MVCモデルのフレームワークを超えて決定する際に少しだけ価値があります。問題は、このソリューションをプロジェクトに含める方法です。
解決策
一見、社会階級に拡大するという明らかな決定。 ネットワークとファクトリーはCI_modelをモデル化し、通常どおり動作します。 しかし、そのようなアプローチのイデオロギー的不忠実さも明らかでした。
- まず、ソーシャルモデルを読み込むことができます。 ファクトリクラスとは別のネットワーク。 したがって、将来的には、十分に責任のあるアウトソーシング業者または判読不能な初心者がこの機会を利用せず、すべての混乱と混乱が戻ります。
- 第二に、クラスにはモデルの機能を含めるべきではありません。
しかし、フレームワークに従うのではなく、実験することにしました。 まず、クラスCI_Loaderのオブジェクトを別のフィールドに配置することにしました。 しかし、クラスに変更を加える必要があるため、ソリューションはあまり成功しませんでした。 次に、CIモデル全体を別のフィールドに移動しようとしました。 これは、クラス図がこのように見える方法です。

Frameworkクラスは、通常のCIモデルです。
class Framework extends CI_Model { /** * * @var stdObject $model */ public $model; /** * * @var stdObject $library */ public $library; public __construct() { parent::__construct; $this->load->model('https'); $this->model->dx_auth = $this->dx_auth; $this->model->https = $this->https; $this->library->db = $this->db; } }
そして出来上がり
class ACSocial { /** * *@var Framework */ public $framework; public function __construct() { $this->framework = new Framework(); ...
ACSocialを継承する任意のクラスのモデルとライブラリに、ほぼ馴染みのある方法でアクセスできるようになりました
$this->framework->model->db->get_where('users', array('id' => $id));
小さなモデルが必要な場合は、コレクションでそれらを選択することはできませんが、Frameworkクラスの別のフィールドとして覚えておいてください。
そして、ファクトリメソッドは、目的のコントローラーまたはモデルに含まれているだけです(コントローラーの外観を損なわないように、ヘルパーでrequireを作成しました)。
