On 11/13/2016 03:16 AM, Matthieu Napoli wrote:
I filed a PR here with my recommendation:
https://github.com/php-fig/fig-standards/pull/837
Thanks.
--Larry Garfield
Thanks, I feel it's easier to discuss that now:
> An entry identifier is a string of at least one character that
uniquely identifies an item within a container.
Sounds good to me, an empty string would be, IMO, problematic. And it
wouldn't surprise me that many containers would throw an exception
with an empty identifier (I even wonder if PHP-DI does it :p).
Is "uniquely" an issue? With aliases (for example) 2 IDs can identify
the same entry.
I read uniquely to mean the same key string always refers to the same
service, not that a service is represented by only one string. Viz,
"foo" and "bar" can both give me the database object, but "foo" won't
sometimes give me a DB object and other times a 3rd party authentication
key string.
> Implementing libraries MUST support identifiers consisting of the
characters A-Z, a-z, 0-9, _, and . in any order in UTF-8 encoding and
a length of up to 64 characters.
That list of characters doesn't include \ which is used by all
autowiring containers (where the ID is the class name). This is IMO an
example of a problem with enumerating all allowed characters: we are
bound to miss some. Same for "-" which is currently not allowed. What
if someone wants to name a service with an emoji? (for whatever reasons).
And I understand you said you wanted to place a "lower bound", but if
some containers don't support "\" then it's a big issue with
interoperability.
Adding more characters to the minimum list is fine by me. I started
with the basic identifier set used by PSR-6 and others but expanding it
is fine.
If we want to expand it as far as "any legal UTF-8 character" as John
Flatness suggests that's an option, although I'm slightly skeptical
there. While we can talk about the hypothetical pizza emoji service, I
would in all honesty immediately reject any patch to a project of mine
that tried to do so. I can't say I've ever seen a service name myself
that was more than the "Standard identifier set" (as above).
The more practical question would be the use of non-latin languages.
I've never worked in a codebase that was written in Hebrew, Arabic,
Cyrillic, or Kanji, and I'm not sure there are any significant projects
that do so even though the language would, technically, support it.
(That may be simply my own ignorance talking; I really have no idea if
such projects are a thing.)
Another problem I see is the max length: why such a maximum? It
doesn't seem very high either, though of course in most cases it would
be fine.
Maximum? It's not a maximum. I have no expectation that any
implementation would realistically support a PHP_MAX_INT number of
characters in an identifier; if for no other reason than memory limits
or constraints in an underlying file system. An implementation backed
by a datastore that requires specifying a length (such as SQL) is going
to have to set a max length of something. (To be fair an SQL-backed
container is an unlikely implementation, but given how generic the spec
currently reads I would argue it's more realistic than a pizza emoji
service.) 64 is suggested as the minimum size an implementation must
support. It could have a cap of 128, 512, or 16 million characters if
it wants, but 12 would not be legal.
I have zero objection to bumping that number higher. 64 is simply what
I borrowed from PSR-6 as a starting point.
I would suggest something like that instead:
> [An entry identifier is a string of at least one character that
uniquely identifies an item within a container.] It can consist of any
characters in UTF-8 encoding.
> Implementing libraries MAY support additional characters and
encodings or longer lengths, but must support at least that minimum.
IMO we can get rid of this sentence because this is exactly the Liskov
Substitution Principle and we removed the sentence about extra
optional parameters for "get()" for the same reason.
I disagree, in the interest of clarity. Especially given how easily
people mistook my intent for setting maximums on possible identifiers,
not minimums, explicitly saying "more than this is completely OK,
really!" makes sense here. In the case of get(), it's arguably a bad
but not forbidden idea to add proprietary parameters. In the case of
the identifier, supporting more variety than the bare minimum is a very
good thing.
> An entry identifier is an opaque string, so callers SHOULD NOT
assume that the structure of the string caries any semantic meaning.
After thinking about it I've switched from "I don't see the point" to
"it's a good idea": some containers use for example "." as a
separator/way to namespace entries, it's good to clear up any
potential confusion here: it's just a string, conventions and
structure can come later but they are out of scope of PSR-11.
That's the reason PSR-6 reserved some characters; on anticipation of, in
the future, using some of them for more advanced functionality like
namespacing. I could see an argument either way for PSR-11's case,
either reserving characters for that or deliberately not reserving
characters but noting that there is no spec-defined meaning. The
question becomes IF a follow-up spec defines a meaning for the {}
characters (for instance), and an existing implementation has already
decided to make it mean something, then what?
Not a clear-cut answer, but a worthwhile question to chew on.
--Larry Garfield
--
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/088c7082-b4df-fcff-2880-ffac82eb6a2a%40garfieldtech.com.
For more options, visit https://groups.google.com/d/optout.