Hey list!
PSR-11 has been accepted so we have standardized how to fetch entries from containers.
The next logical step is to find a common way to put things into a container. More generally, the goal we are seeking is to make it possible for a package author to provide/modify entries in any container (rather than having to write a module/bundle for each framework as it's the case today as I described in this talk: https://thecodingmachine.github.io/forumphp2016talk/index_en.html#60).
Let's be clear that the goal is NOT to define a single way of configuring a container. Each container has its own strategy (configuration files, autowiring, PHP code...) that makes it worthwhile. What we are trying here is to find an additional shared way of putting things into a container specifically for package authors. Because it's almost impossible for package authors to write a bridge for every framework out there).
Also, since FIG 3.0 has passed, it's time that we officially create a working group.
As a reminder, we (the container-interop participants) explored several strategies:
- unified file format
- common interfaces for container definitions
- common interfaces for dumping PHP code representing container definitions
- service providers
I have summarized this in those 2 blog posts: https://www.thecodingmachine.com/psr-11-an-overview-of-interoperable-php-modules/ and https://www.thecodingmachine.com/psr-11-get-ready-for-universal-service-providers/ .
The conclusion we reached was that standardized service providers are the way to go. Among many criteria, they are easy to write, and if done right, can be properly optimized by compiled containers.
We started working on it at https://github.com/container-interop/service-provider/
Work is well advanced: we have prototype integrations available with the major frameworks out there.
There is still a lot of work to be done:
- Recently, Rasmus Schultz came up with an alternative proposal. The idea is that rather than trying to provide factories to the containers (what service providers do), a module could provide its own container and publish to the "main container" the list of entries it contains. Rasmus detailed the idea here: https://github.com/container-interop/service-provider/issues/40 . This idea looks a bit like the "delegate lookup feature" that was removed from PSR-11 in the philosophy (several containers running side-by-side), but is different in the implementation. I'd be interested to gather feedback from the community on Rasmus' proposal (I suspect it might be complementary to container-interop/service-provider rather than opposite)
- With the current proposal, we can already add services and extend existing services. We need to know if we want to be able to do more (like adding/extending services conditionally based on the container's configuration). More generally, we need to discuss the exact scope of the PSR (limited to simple use cases? extended?)
- Finally, there will be a huge amount of work waiting for us in the nitty-gritty (exceptions handling, etc...)
I'm hereby calling interested members to step up to create a working group, and for member projects to give as much feedback as possible. PSR-11 has made a big leap forward in the very last days because "big players" joined the party a bit late :). For this PSR, it would be great to have some feedback from you guys early on in the process.
++
David.
Twitter: @david_negrier
Github: @moufmouf
--
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+unsubscribe@googlegroups.com.
To post to this group, send email to php...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/php-fig/1573992a-355d-42a8-bd1f-c53ebaa43fd1%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
--
As for the standardized provider format you're proposing, I remain of the opinion that this will be of little practical use in real life.
Bootstrapping everything against a single container is, in my opinion, unrealistic - it works for a low number of providers from vendors who carefully coordinate those providers, but at scale, I am fairly confident this will fail hard.
It's kind of like if everyone was sharing a single namespace, and in many ways it's actually worse. You can't possibly know what other vendors are bootstrapping in their providers. Is it safe for me to register a PSR-16 CacheInterface implementation, for example? If two providers do that, you will get terrible unexpected results when one of these randomly "win" depending on the order in which the providers were added.
I work on a fairly large project, and we're starting to see some of these issues surface - different teams can't know about everything that gets bootstrapped by every provider from every other team. It's not safe.
My hypothesis is that isolated modules, that selectively export only domain-specific services etc. are likely much safer, and I think that using proprietaty providers within a given domain is perfectly fine.
I think that the introduction of a standard provider format will effectively mean that almost no one will be able to make use of proprietary container configuration features - the standard format will compete and be at odds with proprietary formats. If successful, it will largely erase the differences between containers. (If unsuccessful, well, the PSR won't have much value.)
So I'm proposing an alternative, not a supplement. Not that I will be putting my energy into derailing your current proposal, just that I don't believe it solves the problem we're facing in my organization - what we're doing now is very much what you're proposing, bootstrapping everything against a single container, and it's already looking non-viable for four teams trying to coordinate providers. I'm afraid this will be much, much worse with hundreds of vendors shipping providers without any coordination.
Anyhow, I'm hoping to do another iteration on the alternative modular approach, probably in the next two weeks.