Hi, Hari!

Comments inline below.

On Tue, Dec 5, 2017 at 10:38 PM, Hari K T <kthar...@gmail.com> wrote:
> I have send a PR to update the Interface so that throws Exception .
> https://github.com/php-fig/fig-standards/pull/975

I've read through that thread. I think the distinction Woody is trying
to understand is whether you (or others on the thread) are implying
there should be an exception type regarding a "failure to understand
the request", or if a request handler should allow bubbling up domain
exceptions. My read of what Woody is saying is that domain logic
should of course be allowed to raise exceptions, but how a consumer of
a handler should handle those is outside the scope of the
specification.

As an author of a middleware framework, the assumption we've had all
along is that any class in the application can potentially throw an
exception. As such, we provide exception handler middleware to ensure
we're able to log errors as well as return an application response.

My feeling on this is: if the specification doesn't explicitly mention
a method can or cannot throw an exception, then it's up to the
implementation to decide what may or may not be exceptional behavior.
In the case of request handlers, I think that's particularly
important, as what constitutes a "valid request" may vary widely (does
the path need to match criteria? do certain attributes need to be
present? etc.), and, most likely, they will be doing domain-specific
processing that may not indicate an "invalid request", but could
result in exceptional behavior as well.

So, my take is: I don't particularly think we should add language
around exceptions here, as becoming *more* specific may actually lead
to too narrow of an interpretation of what is considered acceptable
behavior for an implementation.

> One thing I would like to bring is about splitting the current PSR-15 into
> two .
>
> RequestHandlerInterface and MiddlewareInterface as the repos are split into
> two.
>
> https://github.com/http-interop/http-server-handler
> https://github.com/http-interop/http-server-middleware
>
> I think we can all agree to make this happen, so that it will not make the
> editors and working group and everyone participated in the PSR not consuming
> or dragging the PSR.

This idea has been raised a few times, and, no, we cannot all agree to
make this happen.

This particular proposal set out to standardize *middleware*. While
doing that, an argument was made that what we were calling a
"delegate" also had more general utility and could potentially be
coded to directly. This led to the most recent round of changes, where
we renamed the DelegateInterface to RequestHandlerInterface (and also
renamed the method defined from "process" to "handle"), and changed
the namespace from Psr\Http\ServerMiddleware to the more general
Psr\Http\Server.

We chose as a working group to honor the idea that the
RequestHandlerInterface has its own general utility by splitting the
two interfaces into separate packages, with the MiddlewareInterface
package *depending* on the RequestHandlerInterface package (as the
middleware signature *consumes* a request handler). This allows
developers to code directly to the request handler interface without
requiring the middleware interface; those who want to consume the
primary target of the specification, the MiddlewareInterface, still
have all definitions in place in order to create their
implementations.

An argument has been made that splitting the interfaces into discrete
packages may lead to confusion: a package claiming to implement PSR-15
now has to indicate which interface(s) they implement. To be blunt:
this will always be the case when there are multiple interfaces
defined in a specification. With PSR-7, we have league/uri
implementing ONLY the UriInterface. For quite some time, Guzzle did
not implement ServerRequestInterface or UploadedFileInterface. Were
these PSR-7 implementations? Absolutely. They also clearly indicate
what part(s) of the specification they implement within their
documentation.

With PSR-15, there's a strong liklihood that a developer may only
implement MiddlewareInterface or RequestHandlerInterface -
particularly in packages that provide middleware implementation(s)
(such as the php-middleware project), or in packages such as Diactoros
(where we will likely update our Server class to implement the
RequestHandlerInterface). Shipping the interfaces as separate packages
means that the latter can depend only on the RequestHandlerInterface
package, which clearly signals what it implements. Packages that
depend on the MiddlewareInterface package will need to document what
they implement — which would be true even if the interfaces were
defined in separate specifications!

Additionally, splitting the RequestHandlerInterface into a separate
proposal means delaying this proposal for a minimum of another 3
months, and likely longer, which impacts the libraries that are
already attempting to track the proposal and provide implementations.
This affects the users of those implementations, as they have
uncertainty around what interface(s) to code against, and face
potential for migrations in the future.
This proposal is already stable; it has been floated for around two
years, and the basic workflow has not changed in over a year. It's
literally two interfaces, defining a single method apiece. Delaying it
longer to accommodate a few people who want more granular proposals,
when it's already about as granular as you can get, does a disservice
to those already coding against it.

Defining both interfaces in a single specification but shipping them
as separate packages is a quite reasonable compromise.

-- 
Matthew Weier O'Phinney
mweierophin...@gmail.com
https://mwop.net/

-- 
You received this message because you are subscribed to the Google Groups "PHP 
Framework Interoperability Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to php-fig+unsubscr...@googlegroups.com.
To post to this group, send email to php-fig@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/php-fig/CAJp_myXXc8N3FBGZ5Z46MYiL7rokeekFafRfo3pSr_uQMK4Dgw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to