<ac:macro ac:name="unmigrated-inline-wiki-markup"><ac:plain-text-body><![CDATA[
Zend_DI is a dependency injector component. It minimizes coupling between groups of classes, makes unit testing much simpler, and provides an easy way to re-configure a package to use custom implementations of components. The architecture of the Zend_DI component is based on the following concepts:
Benefits of using a DI Container:Zend Framework: Zend_DI Component Proposal
Proposed Component Name
Zend_DI
Developer Notes
http://framework.zend.com/wiki/display/ZFDEV/Zend_DI
Proposers
My E-mail Address
Revision
0.1 - 21 November 2007: Initial Proposal. (wiki revision: 46)
Table of Contents
1. Overview
2. References
3. Component Requirements, Constraints, and Acceptance Criteria
- This component will use Reflection.
4. Dependencies on Other Framework Components
- Zend_Config
- Zend_Exception
- Zend_Registry
5. Theory of Operation
Zend_DI provides generic factory classes that instantiate instances of classes. These instances are then configured by the container, allowing construction logic to be reused on a broader level. For example:
Once we separate configuration from use, we can easily test the Car with different Engines. It's just a matter of re-configuring the package and injecting Zend_Car_Parts_Engine_Gas instead of Zend_Car_Parts_Engine_Fuel.
6. Milestones / Tasks
- Milestone 1: [DONE] Design interface
- Milestone 2: [DONE] Write proposal
- Milestone 3: [IN PROGRESS] Gather feedback and revise design as necessary
- Milestone 4: Develop full implementation and unit tests
- Milestone 5: Documentation
- Milestone 6: Future enhancements
7. Class Index
- Zend_DI_Container
- Zend_DI_Exception
- Zend_DI_Container_Manager
- Zend_DI_Container_Exception
- Zend_DI_Component_Factory
- Zend_DI_Component_Exception
Future Proposals:
- Zend_DI_Statement
- Zend_DI_Statement_Interface
- Zend_DI_Statement_Parser
8. Use Cases
Zend_DI handles injections via the constructor or setters methods. In addition, the component allows the user to map out specifications for components and their dependencies in a configuration file and generate the objects based on that specification. The configuration object can be set using the setConfig() method.
The use cases below assume that the following classes have are defined:
Constructor dependency injection
The configuration array is typically set up in a different class. Each package can have its own configuration file, a PHP class or an XML file. The configuration file holds the components specifications and package dependencies.
| UC-01 |
|---|
When a class is loaded, the constructor method is selected by default.
| UC-02 |
|---|
| UC-03 |
|---|
| UC-04 |
|---|
Users can map out specifications for components and their dependencies. So whenever a class is loaded, Zend_DI will attempt to inject the dependencies automatically. For example:
| UC-05 |
|---|
Setter dependency injection
| UC-06 |
|---|
Zend_DI injects dependencies using the top-down fashion, starting with the constructor and ending with the setter methods.
| UC-07 |
|---|
Users can map out specifications for a component:
| UC-08 |
|---|
Containers
You can tell Zend_DI what classes to manage by adding them to a container (the order of registration has no significance). Containers can be retrieved using the Zend_DI_Container_Manager::getContainer() method, which returns an instance of the Zend_Registry class.
| UC-09 |
|---|
You can register your own container as long as you pass an instance of the Zend_Registry class. New containers can be register using the registerContainer() method.
| UC-10 |
|---|
Future Proposals
- Zend_DI_Statement
| UC-11 |
|---|
9. Class Skeletons
- Zend_DI_Container
- Zend_DI_Component_Factory
- Zend_DI_Container_Manager