mikemix / mxdi-module
Configure dependency injection in ZF2 using annotations/YAML
Installs: 227
Dependents: 0
Suggesters: 1
Security: 0
Stars: 3
Watchers: 2
Forks: 0
Open Issues: 0
pkg:composer/mikemix/mxdi-module
Requires
- php: >=5.5.0
- doctrine/annotations: ~1.2.4
- ocramius/proxy-manager: ~1.0.0
- symfony/yaml: ~2.7.1
- zendframework/zend-cache: ~2.5
- zendframework/zend-console: ~2.5
- zendframework/zend-modulemanager: ~2.5
- zendframework/zend-mvc: ~2.5
- zendframework/zend-servicemanager: ~2.5
README
Configure dependency injection in Zend Framework 2 using annotations/yaml/xml.
Idea based on the JMSDiExtraBundle for the Symfony2 project.
Installation
-
Install with Composer:
composer require mikemix/mxdi-module:~3.0(rules of semantic versioning apply). -
Enable the module via ZF2 config in
appliation.config.phpundermoduleskey:return [ // // 'modules' => [ 'mxdiModule', // other modules ], // // ];
This will enable the module and register the Abstract Factory in the ZF2's Service Manager.
-
Copy the global config file
cp vendor/mikemix/mxdi-module/resources/mxdimodule.global.php.dist config/autoload/mxdimodule.global.phpif you want to override the default mapping driver. -
Copy the local config file
cp vendor/mikemix/mxdi-module/resources/mxdimodule.local.php.dist config/autoload/mxdimodule.local.phpif you want to override other settings, like caching etc.
Changing mapping driver
The default mapping driver is AnnotationExtractor as source of mapping information for the module. You can change it however to other. Available extractors are:
AnnotationExtractor(default) which uses annotations inside your classes. See the Annotation docs for annotations reference and examples.YamlExtractorwhich uses a yml file. See the YAML docs for examples.XmlExtractorwhich uses a xml file. See the XML docs for examples.
There's no difference between choosing annotation driver or YAML or XML driver, because the mapping information in the end is converted to plain php and stored inside the cache.
Important notes
Remember, the requested service must not be registered in the Service Manager. If you register it as factory or invokable, it won't go through the Abstract Factory and won't get injected. By the way, this allows you to create custom factory for the service in mention.
To speed up locate time you can request the service through the DiFactory invokable, for example:
/** @var \mxdiModule\Service\DiFactory @factory */ $factory = $this->getServiceLocator()->get(\mxdiModule\Service\DiFactory::class); /** @var \YourApplication\Service\SomeService $service */ $service = $factory(\YourApplication\Service\SomeService::class);
Caching
Parsing mapping sources is very heavy. You should enable the cache on production servers.
You can set up caching easily with any custom or pre-existing ZF2 cache adapter. In the config/autoload/mxdimodule.local.php override the cache_adapter and cache_options keys for your needs. You can find more information about available out-of-the-box adapters at the ZF2 docs site.
Debugging
If you get ServiceNotCreated exception most probably one of your injections is not registered in the ZF2's Service Manager. In the exception stack you will see some more detailed information. For instance look for CannotGetValue exceptions.
Console commands
-
Clear generated proxy files:
php public/index.php mxdimodule proxy clearClear all generated proxy files from the proxy dir
-
Clear annotation parsing cache:
php public/index.php mxdimodule cache clear [<fqcn>]Flush whole cache or only of a given service