私はPHPでかなり単純な「ファクトデータベース」を作成しています(Codeigniterを使用していますが、学習目的でフレームワークの内部から離れようとしています)、MVC / OOPの実践を改善しようとしています。
以前は、ファクト モデル、ユーザー モデル、ソース モデルなどを作成し、これらの各モデル内にそれぞれの CRUD ロジックを配置していました。だから、それはこのようになります..
$this->fact_model->save($fact);
$this->user_model->deactivate($uid);
$this->source_model->get_id($sid);
しかし、さらに読んでみると、別の永続化モデル (つまり、「database_model」) を持つことは理にかなっているようです。しかし、オブジェクトの種類ごとに全範囲の CRUD を含める必要があるようで、無駄に思えます。私はこれに行く方法を探していると思います...
$this->db_m->save(Fact $fact);
$this->db_m->update(User $user);
// .. etc .. but also ..
$this->db_m->get_user_id($uid);
// .. and ..
$htis->db_m->get_all_facts();
これは正しい方向に向かっていますか?データベース モデル内の型をテストし、必要に応じて切り替えるだけですか? それとも、オブジェクトの種類ごとにデータベース モデルを拡張する必要がありますか?
$this->fact_db_m->save(Fact $fact);
$this->fact_db_m->get_all();
$this->source_db_m->get_id($sid);
または、CIのAR実装に最も近いと思います。
$this->db_m->save('facts', Fact $fact);
$this->db_m->get('user', array('id'=>$uid));
これは「アクティブなレコードとリポジトリ」のケースだと思います。リポジトリの方がテストしやすく、CRUD ロジックがオブジェクト データから分離されていることを理解しています。この分離は私にとって理にかなっています。それでも..エンティティごとに個別のリポジトリモデルを作成する必要があることを意味します。これは正しいですか?
ところで-Codeigniterにはデータベースクラスがあり、アクティブレコードを使用していることを知っています。ある意味で、それらのアプローチのいくつかでそれを再作成しているだけです。フレームワークの内部に頼らずに物事を理解しようとしているだけです。コメントはありますか?それは単なる選択の問題ですか?