I have quite a general question here, not a specific problem. I have a Vue + Laravel site that mainly - mainly - handles bookings for training courses. It also handles orders for a few physical products (textbooks), and handles people buying access to e-learning courses. So it has a custom basket and order processing system that handles these three distinct parts of each order. An order can consist of all 3 things at once, and so the backend has to be able to handle that 'all at once'.
The process for handling a course booking can be quite complex because each course is different. Each course can have multiple delegates. Some courses have exam fees, some don't. Some have a residential option, some don't. A customer might book a course where one delegate will take the residential option and another won't. Etc etc. And then of course they might also order access to an e-learning course, so a new user account has to be created, and so on.
At the moment, the controller for the checkout process is quite large and unwieldy. It handles all these different possibilities with functions all over the place.
From a design perspective, what is the best way to handle all these disparate elements? I've heard the phrase 'fat models, thin controllers' - at the moment the exact opposite is the case. I realise there's not much info to go on here, happy to elaborate further. I guess I'm looking for some general tips as to how things are best structured so I can research further.