Je suis très confus quant au concept de "modèle" dans MVC. La plupart des frameworks qui existent aujourd'hui placent le modèle entre le contrôleur et la base de données, et le modèle agit presque comme une couche d'abstraction de la base de données. Le concept de 'Fat Model Skinny Controller' est perdu lorsque le contrôleur commence à faire de plus en plus de logique.
Dans DDD, il existe également le concept d'entité de domaine, qui possède une identité unique. Si j'ai bien compris, un utilisateur est un bon exemple d'Entité (userid unique, par exemple). L'entité a un cycle de vie - ses valeurs peuvent changer au cours de l'action - puis elle est sauvegardée ou éliminée.
L'entité que je décris ci-dessus est ce que je pensais que le modèle était censé être dans MVC ? A quel point suis-je à côté de la plaque ?
Pour encombrer davantage les choses, vous ajoutez d'autres patterns, comme le pattern Repository (en y ajoutant peut-être un Service). La manière dont le Repository interagit avec une Entity est assez claire, mais comment le fait-il avec un Model ?
Les contrôleurs peuvent avoir plusieurs modèles, ce qui donne l'impression qu'un modèle est moins une "table de base de données" qu'une entité unique.
UPDATE : Dans ce poste le modèle est décrit comme quelque chose ayant des connaissances, et il peut être singulier ou une collection d'objets. Il semble donc qu'une Entité et un Modèle soient plus ou moins identiques. Le Modèle est un terme englobant, alors qu'une Entité est plus spécifique. Un objet de valeur serait également un modèle. Au moins en termes de MVC. Peut-être ?
Alors, en termes très approximatifs, lequel est le meilleur ?
Pas de "Modèle" vraiment ...
class MyController {
public function index() {
$repo = new PostRepository();
$posts = $repo->findAllByDateRange('within 30 days');
foreach($posts as $post) {
echo $post->Author;
}
}
}
Ou ceci, qui a un modèle comme DAO ?
class MyController {
public function index() {
$model = new PostModel();
// maybe this returns a PostRepository?
$posts = $model->findAllByDateRange('within 30 days');
while($posts->getNext()) {
echo $posts->Post->Author;
}
}
}
Ces deux exemples n'ont même pas fait ce que je décrivais ci-dessus. Je suis clairement perdu. Une contribution ?