zendframework / zend-servicemanager

ServiceManager component from Zend Framework
BSD 3-Clause "New" or "Revised" License
188 stars 89 forks source link

Detect cyclic dependency using reflection abstract factory #261

Open asgrim opened 6 years ago

asgrim commented 6 years ago

This is a new feature whereby cyclic dependencies are detected in a bit of an edge case. Example illustrated here: https://gist.github.com/asgrim/72f3ee4c25b901ffed58501657ea98da

I've written the test which demonstrates what I'm trying to do, but the implementation I feel is really sub-par however. My plan to implement was simply to check if $requestedName === $type (i.e. the requested service name is the same as the parameter type being used), but in practice this doesn't work because $requestedName is actually the resolved name:

https://github.com/zendframework/zend-servicemanager/blob/develop/src/ServiceManager.php#L209-L222

On L209 the alias is resolved, and on L222 doCreate is called with the $resolvedName so we never have the actual originally requested service name.

Therefore the only solution I could come up with for now was to check if the $container is a ServiceManager and reverse-engineer the service name to the original alias. Really not keen on this though, but I'm lacking on any better ideas. Feedback welcome here! :+1:

It's worth adding that in real terms, this is a user error, but I just wanted to catch this situation and provide some useful feedback (instead of something unclear Maximum function nesting level of '500' reached, aborting!), so if there's not a practical way to solve this problem, it simply may not be worth the effort.

weierophinney commented 5 years ago

@asgrim Is this still a WIP? I've scheduled for 3.4.0, but if it's not ready, I'll wait...

Ocramius commented 5 years ago

Given the hacky nature of this, I wouldn't merge it at all, to be honest...

weierophinney commented 4 years ago

This repository has been closed and moved to laminas/laminas-servicemanager; a new issue has been opened at https://github.com/laminas/laminas-servicemanager/issues/13.

weierophinney commented 4 years ago

This repository has been moved to laminas/laminas-servicemanager. If you feel that this patch is still relevant, please re-open against that repository, and reference this issue. To re-open, we suggest the following workflow: