what is reason for only scalar and array values in payload? Can it be more flexible with object which has toString or toArray method? I would use event dispatched which contain complete ValueObject or similar thing, then I can build ReadModel without unnecessary call to repository.
yes, it can be more flexible but you have to implement your own basic message against the message interface: https://github.com/prooph/common/blob/master/docs/messaging.md#custom-messages
The reason why prooph's default message implementation only allows scalars and arrays can also be found in the docs: https://github.com/prooph/common/blob/master/docs/messaging.md#payload
Since prooph/common 3.x payload is no longer part of the message object but instead methods are required to get/set the payload. Payload is the data transported by the message. It should only consist of scalar types and sub arrays so that it can easily be json_encoded and json_decoded. Implementers don't need to manage a payload property but public function payload() should return the message data. The protected function setPayload(array $payload) method instead should reconstitute message data from given payload array.