For a project where I had a very long form, I left the controller and the view unchanged, PHP-wise, and rather divided it in logical blocks that made my form steps in fact.
Using HTML, CSS, and JS (jQuery since it’s already loaded), I used <fieldset> tags for each block, and then hid them with JS when the view is loaded.
I added a simple breadcrumb in HTML and CSS, and used JS to hide/display <fieldset> blocks according to what is clicked in the breadcrumb.
It totally fit the goal.
One important thing: in my case, I didn’t need to validate each step, I did one validation for the whole form, since my main problem was just the form length.
Now, if you need to validate each step, or save the form gradually and recover it, like to allow drafts, etc. I also recommend wizard-behavior extension, although I haven’t had the opportunity to use it in a real project yet.