CFWheels is a CFML framework based on Ruby on Rails – at least it shares a lot of the same concepts from what I can tell. My previous experience with frameworks hasn’t been too great. I got put off the ‘big player’ names like Model Glue, Fusebox et al, as when I investigated them (admittedly a few of years ago) I got instantly put off by XML configuration, and quite frankly, some concepts I just couldn’t grasp at the time. Also, loading 100’s of templates for the apps I was writing at the time was just unnecessary.
Maybe the timing’s good, but I’ve been blown away by CFWheels.
My own coding style has changed a lot in the last 12 – 36 months, and I was getting to the point where I was writing lots of custom code to do certain things – a good example would be URL rewriting – each application I’d write would have similar, if not the same requirements. I’m a big fan of logical and symantically meaningful URL paths, and where I can, I’ve been trying to gradually make all my apps follow some sort of pattern. Once you find something which works, you basically cut and paste it into every new app you make, and each application might it’s own quirks, meaning you have multiple, similar versions of the same block of code.
Basic CRUD operations too – it’s incredible how much code I’ve written over the years which is based around what I’d call a ‘CRUD switch’ – i.e a cfswitch block with cases of ‘view,add,edit,delete’. Almost without realising it , I’d been gradually moving towards the MVC pattern of coding, it just made sense.
Enter CFWheels: I downloaded it, and started playing. Within about 2-3 hours, I’d mastered enough of the basics to port an existing (simple) site over. I even got to the point where I was using an internal Wheels function, and just *guessed* what the arguments should have been; low and behold, it worked. When you find a framework which actually ‘thinks’ like you do, it’s a pretty great feeling.
My particular highlights thus far:
- Basic jawdropping when I realised the power of the internal ORM engine.
- ‘Routes’ – very, very useful.
- The separate configuration setting options for development/design/production etc
- Caching is, well, just painless.
- HasMany() – running out of superlatives, but to be able to say, ‘Departments hasMany People’ and then in the People model, ‘People BelongsTo Departments’, and then refer directly to the relationship without a line of SQL? cool.
- The Form Helpers save a lot of code.
- The CFWheels Google group guys have been really helpful, and the documentation is excellent.
- The Global Helpers bit is very useful, previously, you’d have to cache all your Utility functions in a CFC and chuck it in the Application scope – now you just add it to one place to make it available to all your views.
- All the internal Wheels functions – when I’d hit a point where I thought ‘there should be a function for this’, there was.
- It’s fast. Especially on Railo (disclaimer: it just ‘feels’ fast! And no, i’ve not tried it on CF9, and no, I’ve got no figures to back this one up)
Naturally, some low points too:
- Note to self: don’t casually, or accidently dump extremely large objects on a production server. It appears to eat up RAM very quickly.
- Associations – amazing concept, but out of everything, took me the longest time to get my head around; then I found ‘shortcuts’ and it all made sense.
- I did get initially confused when something which I expected to be a query turned out to be an object..(then I found you can override that behaviour!)
- The routes system could really do with a better ‘catchall’ system – it works, but I don’t want to have to specify all my controllers routes: I want Wheels to introspect them and work it out 🙂 (I’m aware there is talk going on re: this issue)
- I still want to see some more example applications of best practice / example apps generally.
- It took me a while to be comfortable with *NOT* scoping everything 🙂
All in all, I’m really enjoying this one, and it’s made me reconsider my previously (slight naïve) position on frameworks.
Well worth a couple of hours of your life to try.