この質問は非常に具体的で長く、 CodeIgniter のモデルの拡張を扱っています。それは重要ではありません (私のアプリケーションは現在動作しています) が、これを行うための「クリーンな」方法があるかどうか疑問に思っているので、これを尋ねています。
最近、モデルのCRUD メソッドを汎用にするために使用しているトリックについてのブログ投稿を書きました。モデルが関係する場合は「データベース」ライブラリのみを使用するため、コア モデル (MY_Model) を拡張して、データベースを自動ロードするのではなく、コンストラクターからロードするだけにしました。それをオートロードすることは大したことではありませんが、要点は次のとおりです (そして、それは次のことにとって重要です)。将来、このコンストラクターを使用して他のことを実行する可能性があるため、コンストラクターが必要です。
CRUD メソッドを汎用化しようと考えたとき、もう一度 MY_Model を使用することを考えたところ、「create」、「update」、「delete」、および「load_from_id」メソッドを正常に定義できました。ただし、これらのメソッドは、インターフェイス、または任意のモデルで定義する必要があるメソッドのセットに暗黙的に依存しています(静的/定数パラメーターのオーバーライドに加えて、たとえば、いくつかの検証、または特定の結果をカスケードするために削除時に呼び出される関数) DB で)。2 つのソリューション。PHPインターフェイスを使用するか、MY_Model を抽象化し、抽象メソッドを宣言します。
解決策 2 は実装できません。MY_Model に有効なコンストラクターが必要であり、いずれにせよ、CI_Model のコンストラクターを呼び出せる必要があるためです (これまでに何もなくても、絶対にないとは限りません)。 . この場合、継承スタックは (具象 [ CI_Model
], 抽象 [ MY_Model
], 具象 [ ]) になり、具象モデルからAny_model
呼び出すときに「世代をスキップする」必要があります。parent::__construct();
さらに、CI が抽象コア クラス拡張をサポートしているかどうかもわかりません。
解決策1については、実装できるかどうかもわかりません。MY_Model
具体的なクラスとインターフェイスを定義するとしましょうCrudModelInterface
。私はすべての属性を入れましたMY_Model
(それらはインターフェイスにはありません) が、CRUD メソッドはそれらを使用する必要があるため、正しくCrudModelInterface
拡張する必要がありMY_Model
ますか? そこがぼやけてしまうところです...
私がやりたいことを理解していただければ、私のデザイン、どのようにそれを行うかなどについてアドバイスをいただけないでしょうか。建設的なことなら何でも。現在、これらの「インターフェースメソッド」を定義するための制約を課していませんが、すべてのモデルでそれを行っているため、機能します。あまりきれいではありません。