Re: RFC: Server-Side Request and Response Objects (v2)
| From: | Niklas Keller | Date: | Wed, 12 Feb 2020 18:20:56 +0000 |
| Subject: | Re: RFC: Server-Side Request and Response Objects (v2) | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-108512@lists.php.net to get a copy of this message | ||
> Hi Internals,
>
> After a couple of years of incubation, I am happy to offer a second version of this RFC:
>
> https://wiki.php.net/rfc/request_response
>
> It proposes an object-oriented approach around request and response functionality already
> existing in PHP, in order to reduce the global-state problems that come with superglobals and the
> various response-related functions.
>
> The SQLite "about" page says, "Think of SQLite not as a replacement for Oracle
> but as a replacement for fopen()."
> <https://www.sqlite.org/about.html> Likewise, think of this
> RFC not as a replacement for HttpFoundation or PSR-7, or as a model of HTTP messages, but as an
> object-oriented alternative to superglobals, header(), setcookie(), setrawcookie(), and so on.
>
> Thanks in advance for your time and consideration while evaluating it.
Hey Paul,
I think the request / response API is entirely fine being solved in
userland instead of in php-src. However, since you already made such a
proposal, I want to give some feedback:
Naming
I think we shouldn't take over the naming of the super globals, e.g.
$_GET really contains the query parameters and has nothing to do with
GET or POST, so $request->getQueryParameter(...) would be a better
name.
Type Safety
I think the API should be type safe. Currently $request->get['key']
can be null | string | string[] | ... Most parameters only appear a
single time, so a method returning the first parameter value or null
could be used instead.
API Issues
I don't see any reason to keep specials such as
$_SERVER['HTTP_X_REQUESTED_WITH'] vs. $request->requestedWith, which
is just another HTTP header.
If there's $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] => $request->method
and $_SERVER['REQUEST_METHOD'] => $request->method, how can I get the
original (actual) method?
Given 'echo $content; => $response->setContent($content);', shouldn't
this rather be something like
addContent()? How does streaming
responses work? There's ServerResponseSender, but I think this should
be part of the Response API.
The Request object should be mutable, e.g. you might want to change
the client IP to be based on a x-forwarded-header instead of the TCP
source address.
Other Commentary
> A: It supports async exactly as much as PHP itself does.
Not really. PHP has built-in stream_select / non-blocking streams, so
supports the tools required for async out of the box.
Regards, Niklas