1) I use a simple set of homebrew classes for some of my MVC materials and associate controller names with action and view names (this is a Front Controller style similar to Zend). For a general website, let's say that it has a homepage, privacy policy, contact page, and page. I really don't want to create separate controllers for all these things, so I will stick to them inside my IndexController with function names like actionIndex() , actionPrivacy() , actionContact() and actionAbout() .
To agree with this, inside my view catalog I have a catalog of templates associated with each action. By default, any action automatically searches for a related template, although you can specify it if you want. So, actionPrivacy() will look for the template file in index/privacy.php actionContact() , actionContact() will look for index/contact.php , etc.
Of course, this also applies to URLs. So the URL specified at http://www.example.com/index/about will trigger actionAbout() , which will load the About template. Since the page has completely static content, my actionAbout() does nothing but provide a public action to view and run Front Controller.
So, to answer the gist of your question, I put several "pages" in one controller, and it works great for my purposes. One model per controller is a theory that I don’t think I will try to follow when working with web MVC, since it seems to be better suited for a stateful application.
2) For this, I will have several controllers. Following the same methods that I use above, I would have /admin/dashboard and /account/dashboard , as you suggest, although there is no reason why they could not use the same (or the same) templates.
I believe that if I had many different users, I would make things more universal and use only one controller and have a mod_rewrite rule to handle loading. This will probably depend on how functionally complex the toolbar is and how the account is configured.
3) I find that CRUD functions are difficult to implement directly in any MVC layer and still have cleanliness, flexibility, and efficiency. I like to abstract CRUD functionality to a service level that any object can call, and to have a class of base objects from which I can distribute any objects that require CRUD.
I would suggest using some of the PHP ORM frameworks for CRUD. They can do away with a lot of hassle in getting a good implementation.
In terms of the login controller and user controller, I suppose it depends on your application domain. With my programming style, I would tend to think of “logging in” as a simple operation in the domain of the user model and thus have one operation for it inside the user controller. To be more precise, I would like UserController instantiate the user model and invoke the model login procedure. I can’t tell you that this is the right way, because I couldn’t say exactly what the right way should be. This is a matter of context.
4) You are right about freedom. You can easily create a controller that handled everything your application / website wanted to do. However, I think you will agree that this will be a nightmare for service. I am still getting jibbly-jibblies thinking about my last job at a market research company where an internal PHP application was made by an overseas team, and I can only assume that it was not very real. We are talking about 10,000 string scripts that processed the entire site. It was impossible to maintain.
So, I suggest you break your application / website in the domain of business domain and create controllers on it. Find out the basic concepts of your application and from there.
Example
Let's say I have a website about manatees, because obviously manat is rock. I would like some regular site pages (about, contacts, etc.), user account management, a forum, an art gallery and, possibly, a research document material area (with the latest science about manatees). Pretty simple, and a lot of this would be static, but you can start to see a breakdown.
IndexController - processes the page, privacy policy, general static content.
UserController - handles account creation, on / off, settings
PictureController - display images, upload files
ForumController - maybe not so much, I would try to integrate an external forum, which would mean that I do not need more functionality here.
LibraryController - Show Lists of Latest News and Research
HugAManateeController - a virtual maze hugging in real time via HTTP
This probably gives you at least a basic split. If you find that the controller is becoming very large, it may be time to break the business domain into separate controllers.
This will be different for each project, so a little planning will significantly affect the architecture structure that you will have.
Web MVC can become very subjective because it is very different from the MVC model in which your application has state. I am trying to preserve the main functionality of the controllers when working with web applications. I like that they create several objects or models, run several methods based on the action taken, and collect some View data for transmission to the view after it is completed. The simpler, the better, and I put the core business logic in models that are supposed to represent the state of the application.
Hope this helps.