Skip to content

Detect cyclic dependency using reflection abstract factory #13

Closed
@weierophinney

Description

@weierophinney

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! 👍

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.


Originally posted by @asgrim at zendframework/zend-servicemanager#261

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions