How should MVC be implemented in PHP?
===

I've been trying to implement an MVC architecture in my PHP projects but I'm having a really hard time to understand the implementation of it. I totally understand the concept and benefits of separation, but no one ever taught me how to apply it right.

I know that design patterns are 'just guidelines' and do not define the actual implementation of those guidelines, but the implementations I've came across in books and tutorials all vary greatly and contradict each other. Perfect example is [this][1] question on SO where there seems to be no consensus about whether form validation should take place in the controller or in the model...

In school I got taught a basic implementation of MVC and learned to separate an application in 5 layers. Although i can see the benefits of the separation, I have the feeling that this implementation is horribly wrong, because of too many reasons to list here. 

Opinions about this implementation would be very much appreciated, as well as links to  tutorials/books/videos/example applications which teach a proper MVC implementation.

 - **Entities** - 'Everything' should be defined in separate entity classes.
    
Example: the Contacts class which has a property for every column in the contacts table (database). The class is saved as as contacts.class.php in the entities folder. No logic happens here, only declaration of properties and getters/setters. 
     
Another example could be the Pagination entity, which holds properties like $totalPages, $currentPage, $numRowsPerPage...

 - **Controllers** - Controllers are the backbone of the application. The way I've learned it these are just PHP files (no class definitions) that reside in the home directory of your application and where the user surfs to. Each controller instantiates the appropriate service classes, then calls the right methods which return data, and finally includes the appropriate views to present that data to the user.

Example: the add-contact.php page which resides in the home directory. This page includes the show-contacts-form.php view and checks if the form has been submitted. If so, the ContactsService class gets instantiated, and the validateContactForm() method gets called. If this method returns any errors then they get shown, if not the addContact() method gets called and the user is being redirected to the contacts.php controller, which shows all contacts.

 - **Services** - Services get called by the controller and handle most of the business logic.

Example: the ContactsService class which holds methods like validateAddContactForm() which receives form data from the controller and returns an array of errors (if there are any).

Another method could be addContact(), which receives validated and sanitized data from the controller. This method instantiates the ContactsDAO class and calls the addContact() method.

 - **Data Abstraction** - This is where communication with the database takes place.

Example: the ContactsDAO class which gets instantiated by methods in the ContactsService class. This class holds methods like addContact() which receives validated and sanitized input by the service layer.

 - **Views** - This is what the user sees, and consists mostly of HTML

Example: the add-contact.php view, which shows the user a form to add contacts to the database.

  [1]: http://stackoverflow.com/questions/5651175/mvc-question-should-i-put-form-validation-rules-in-the-controller-or-model