https://github.com/thecodingmachine/container-discovery
Allowing discovery of container objects through Puli
https://github.com/thecodingmachine/container-discovery
Last synced: 3 months ago
JSON representation
Allowing discovery of container objects through Puli
- Host: GitHub
- URL: https://github.com/thecodingmachine/container-discovery
- Owner: thecodingmachine
- License: mit
- Created: 2015-11-30T17:24:33.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2015-11-30T17:25:02.000Z (over 10 years ago)
- Last Synced: 2025-02-16T12:30:25.910Z (over 1 year ago)
- Language: PHP
- Size: 1.95 KB
- Stars: 1
- Watchers: 6
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Containers discovery for *container-interop*
This package contains an interface and Puli binding-types to automatically discover containers.
## Introduction
*container-interop* defines a common interface for Container objects (the `ContainerInterface`).
This package proposes a default interface for factories that can generate container objects.
This factory is static and can be automatically detected by Puli using class discovery.
The goal is to allow a composite container to automatically detect and create container instances.
## Installation
```
composer require thecodingmachine/container-discovery@dev
```
This package adheres to the [SemVer](http://semver.org/) specification and will be fully backward compatible between minor versions.
## Containers discovery
The goal of this package is to enable a package to automatically publish or discover **containers**.
To automatically provide a *container* to your application, we use [Puli's discovery mechanism](http://docs.puli.io/en/latest/discovery/introduction.html).
This package contains a Puli **binding-type** named `container-interop/ContainerFactories`.
This binding-type should contain fully qualified class names implementing the `ContainerFactoryInterface` interface.
## Providing containers
To provide a container, write a `ContainerFactory` that will return an instance of your container implementing
`ContainerInterface`.
For instance (using [Picotainer](https://github.com/mouf/picotainer)):
```php
namespace My\Package;
use Interop\Container\Factory\ContainerFactoryInterface;
use Assembly\ArrayDefinitionProvider;
class MyContainerFactory implements ContainerFactoryInterface {
public static function buildContainer(ContainerInterface $rootContainer, Discovery $discovery) {
return new Picotainer([
'logger' => function() {
new MyLogger();
},
$rootContainer
]);
}
}
```
Once your class is written, use Puli to bind it to the list of available containers:
```sh
$ puli bind "My\\Package\\MyContainerFactory" container-interop/ContainerFactories
```
Note: by convention, you can add a "priority" parameter to the binding. Default priority is 0. Lower priorities
are processed first (and therefore, higher priorities are overloading lower priorities).
```sh
$ puli bind "My\\Package\\MyContainerFactory" container-interop/ContainerFactories --param priority=42
```
## Consuming containers
In your code, you can find all classes of the `container-interop/ContainerFactories` binding-type using:
```php
// $discovery is the Puli Discovery object.
$factories = $discovery->findByType('container-interop/ContainerFactories');
// TODO: sample code to sort by priority.
```