From a seasoned back end developers perspective I actually agree sharply with point 6 for any project bigger than trivial. Fat controllers are terrible for testability and code reuse. When code is in clear layers it creates predictable responsibility. Repositories (specified contractually with interfaces) for persistence, services for business logic, controllers for reading inputs, calling services and streaming output. Such a setup allows a very healthy mix of integration, unit and functional testing and as a consequence, release confidence. And yes, this applies equally for PHP as it does Java or C#.