There is no enforcement by Play for any set design pattern.
It is a convention only.
And there certainly is no "magic" to be had either.
Scala and Play do a lot of really ace things for you - but your application design is really up to you.
For the service layer, you can create it any way you like.
I was also a little thrown, initially, by there being a lot of business logic in the controllers of the example applications.
previously - the controllers, for me, were nothing but a list of steps (function calls).
Which made it easy to see what steps an action took, when fired off by an event.
Via this group and the Melbourne Scala users group - it was explained to me that it was common-place to have a lot of logic in the controllers - and that I should start seeing them as the interface between the model and view.
(Which of course they are).
But I have never visualised them like that before.
It was a little weird, for me, to be honest.
I am building an application like that at the moment, because I have been convinced that's "the way it is" and every one is expecting to see it that way - then for future-proofing / getting other people to work on the application - then it makes sense to do it the manner that others "expect".
Saying that : "I" am still not totally sold on it.
If you're still not convinced of the "fat" controller idea - you are of course completely free to desogn your application any way you like.
A companion object is a great place to start with your service code.
It is inherently attached to the class - and is automatically (via the compiler) a singleton, too.
Or, you can use a wholly other source file and create a XXXService class or XXManager class (Whatever you like to use as a naoming convention - for allyour publc API work.
Let me also give you this;
If you ever plan to use Akka, or the application is a large enough (load) that you feel the need to cluster / reverse proxy - make sure your code is immutable / stateless, from the start.
It will save you a lot of work and headaches down the track.
Again there is no "set" way for it - just about everyone will tell you that you data and structures should "always" be immutable.
Admittedly, at first it seems likea burden - but after a while you do get used to it.
The confidence you get as a developer from actually knowing that your data cannot change, is an amzing relief!