En fait, très grosso modo le fonctionnement de truc comme Symfony (enfin je ne l'utilise pas vraiment mais j'ai pu voir que c'est adopté un peu partout, chacun ayant quand même ses différences).
Tu as ce qu'on peut appeler une application (le site public est une application, le site admin est une application).
Tu as un fichier appelant le contrôleur de cette application. Celle ci appelle un routeur qui lui est chargé de renvoyer sur un bon module en fonction de l'URL (de l'URL rewriting, sauf qu'ici on peut très bien le faire sans htaccess, enfin on aura besoin de lui pour autre chose mais ça n'est pas obligatoirement lui qui va gérer l'url rewriting (d'ailleurs question, pourquoi utiliser un fichier pour ça (XML, Yaml ou autre) au lieu d'un htaccess ? En terme par exemple de performance est ce qu'un htaccess ne se revelerait pas plus rapide ?)).
Exemple;
/news.html -> url, module -> news, action -> index
On a en bref 3 paramètres ici; l'url, le module et l'action.
L'URL je pense que tu as compris, le module bah ici on va se diriger vers le module news et charger son contrôleur. Seulement voilà on peut par exemple liste des news, en ajouter, en supprimer etc ça ce sont les actions (tout ça est représenté sous la forme d'une classe et les actions sont donc des méthodes).
Tout ça ne sert uniquement à charger le bon contrôleur et a exécuter la bonne méthode.
Et c'est dans cette méthode que tu vas charger ton modèle, faire tes vérifications pour finalement envoyer le tout à la vue.
Bon c'est vraiment très synthétisé, tu as pas mal de classes principales qui s'occupent de la vue en elle même, des routes, du contrôleur principal, des applications etc. Donc tu ne verras aucun include ou autre dans tes contrôleurs, tout ça se passe avant (enfin faut bien un autoload pour charger les classes principales hein) mais ce que je veut dire c'est que chacun a son job à faire et que l'un ne va pas empiéter sur le boulot de l'autre, on ne mélange pas tout?