@kreghx There’s no hard and fast rule when it comes to structuring, organising, and writing code. If there were, machines would already be doing it ;)
In the case of lots of parameters in a class constructor, it’s an indication (and only an indication) that the class may be doing too much. You’ll just need to look classes on a case by case basis when you find it requires lots of parameters to see if the class accurate models an entity in your application, or whether there may be smaller, more appropriate objects that could be extracted. Without concrete examples, that’s hard to advise on.
In the example you did provide (the create payment class) it looks similar the subscription builder class in Laravel Cashier. I don’t know your application, but I imagine a coupon is optional for creating a payment? If this is the case, then it doesn’t need to be a parameter in your class’s constructor.
Your class constructors should require the least number of parameters possible to instantiate a valid instance of that object. Any additional attributes can be supplied using other class methods (i.e. withCoupon($coupon)).