To properly define what form data an endpoint accepts, it should be possible to define simple model classes that the route links to. The endpoint can then get access to this either through the Request object, or maybe the dependency injection container can be extended to support this.