私がやること :
私のモデルはデータベースにリンクされたエンティティではない(教義を使用していない場合)ため、「アクティブなレコード」メソッドはありません。オブジェクトはその依存関係を取得する方法を知りません (たとえば、ユーザーは n 個のコメントを持っている可能性があり、私のモデルはコメントを取得する方法を知りません)。
class User{
private $name;
private $password;
// getter and setters
}
プロバイダーからモデルを取得できるいくつかのビジネス ロジックを保持するサービスがあります。サービスには多くのプロバイダーを含めることができます。
class UserService{
function __construct(IUserProvider $userProvider){
$this->userProvider = $userProvider
}
function getUsers(){
// return an array of user objects
return $this->userProvider->getUsers();
}
}
最後に、データベース、テキスト ファイル、json ファイル、webservice からデータを要求する方法を知っているデータ プロバイダーがあります。
class UserProvider implements IUserProvider{
function __construct(Connection $connection){
$this->connection = $connection;
}
function getUsers(){
return $this->toUsers($this->connection->fetchAssoc("Select * from users"));
}
function toUsers(array $datas){
// convert user records to an array of User
(...)
return $users;
}
}
次にインターフェース
interface IUserProvider{
/**@return array an array of User */
function getUsers();
}
ユーザーのコメントを取得する必要がある場合、コメント サービスはユーザー ID からコメントを取得する方法を認識しています。したがって、ユーザーとそのコメントを取得するには、データベースへの 2 つのリクエストが必要です。1 つは UserProvider から、もう 1 つは CommentProvider からです。
だから私は3つの層を持っています:
- 私のアプリケーション層(ユーザーの表示、リクエストへの応答...)
- 私のサービスレイヤー(コマンドラインインターフェイスで動作する必要があり、私のWebアプリケーションを認識しません。通常、私が使用するフレームワークにバインドされているパスワードエンコーディングと、おそらくACLスタッフ...)
- 他のレイヤーについて何も知らない私のデータアクセスレイヤー、
私のレイヤーが通信する唯一の方法は、レイヤーからレイヤーに渡すモデルを介することです。
また、すべてのクラスは依存性注入コンテナーを使用して構築されているため、配線は問題になりません。
これは私が作ったアプリの例です。これはオープンソースです: https://github.com/Mparaiso/silex-bookmarkly
どんな考えでも大歓迎です。