A Web framework should provide 4 things to the end developer:
All of these things together make a great framework because they help you write code in the most efficient, reusable manner. Let's examine each bullet point in detail.
Libraries are essential to a good framework. Without them, you are left constantly re-inventing the wheel to get things done. A couple of thoughts should be at the forefront of your mind when evaluating a library's value. Testability: where are the unit tests? Without good unit tests, a library is just a promise of functionality. Speed: will it slow my site down but save my development time? A good trade-off of performance of the library against saved development time is always desirable.
The spirit of any framework is in it's methodology. Does the framework allow for events/hooks/callbacks? Does the framework organize application structure in a way that is expandable? Does the URL translate to a piece of code in a memorable way? These issues are all important to the methodology of a framework.
When looking a at framework, ask yourself: am I re-typing a bunch of things that the system should be figuring out for me? If the answer is, yes, then your framework does not have good defaults. Good defaults reduce the need for scaffolding code because the system can figure out a default way to behave without the need for generated code. Automatically relating a template file to the requested controller action is another example of sensible defaults. Without sensible defaults, you are repeatedly making explicit method calls that could reduce the re-usability of your code as well as cause potential problems during an upgrade.
When you have written a module for a framework, how does the framework treat your finished product? Can it be installed? Does your code integrate with any sort of management panel? Does your module get upgrade, install, and un-install procedures the same as the core framework's own code?