deefour / producer
Simple rule-based class resolution
Installs: 1 929
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 2
Forks: 0
Open Issues: 0
Requires
- php: >=5.5.0
- illuminate/support: ^5.0
Requires (Dev)
- illuminate/container: ^5.0
- illuminate/support: ^5.0
- phpspec/phpspec: ^2.4.0
This package is auto-updated.
Last update: 2024-12-16 08:56:02 UTC
README
A small class factory.
Getting Started
Run the following to add Producer to your project's composer.json
. See Packagist for specific versions.
composer require deefour/producer
>=PHP5.5.0
is required.
Overview
A Producer
is a class that resolves the FQCN of related Producible
classes. The Factory
accepts a Producer
and "type", and can instantiate a concrete Producible
class based on the resolved FQCN returned.
Producers and Producibles
The production factory only accepts classes that implement Deefour\Producer\Contracts\Producer
. An exception will be thrown if the resolved class does not implement Deefour\Producer\Contracts\Producible
.
Given the following classes
use Deefour\Producer\Contracts\Producer; use Deefour\Producer\Contracts\Producible; class Podcast implements Producer { // ... } class PodcastPolicy implements Producible { // ... } class PodcastScope implements Producible { // ... }
the production factory can produce an instance of each producible above when given a podcast and "type".
use Deefour\Producer\Factory; $podcast = new Podcast(); $factory = new Factory(); $factory->resolve($podcast, 'policy'); //=> 'PodcastPolicy` $factory->resolve($podcast, 'scope'); //=> 'PodcastScope` $factory->make($podcast, 'policy'); //=> instance of PodcastPolicy
Resolving Producibles
The default producible resolver on the produciton factory looks like this
get_class($producer) . ucfirst($type)
This can be customized by implementing a resolve()
method on the producer passed into the factory.
use Deefour\Producer\Contracts\Producer; class Podcast implements Producer { public function resolve($type) { // return FQCN string here } }
This deefour/producer
package also comes with a more opinionated resolver at Deefour\Producer\ResolvesProducibles
.
namespace App; use Deefour\Producer\ResolvesProducibles; use Deefour\Producer\Contracts\Producer; class Podcast implements Producer { use ResolvesProducibles; }
this will pluralize the "type" passed in and append that to the namespace of the producer doing the class resolution.
use App\Podcast; use Deefour\Producer\Factory; $podcast = new Podcast(); $factory = new Factory(); $factory->resolve($podcast, 'policy'); //=> 'App\Policies\PodcastPolicy`
Making Producibles
The default producible instantiator on the production factory looks like this
new $producible($producer);
This can be customized by implementing a make()
method on the producer passed into the factory.
use Deefour\Producer\Contracts\Producer; class Podcast implements Producer { public function make($producible) { // instantiate the passed $producible (an FQCN) } }
Note: The Deefour\Producer\ResolvesProducibles
trait does not implement the make()
method.
Contribute
- Issue Tracker: https://github.com/deefour/producer/issues
- Source Code: https://github.com/deefour/producer
Changelog
1.0.0 - October 7, 2015
- Release 1.0.0.
0.1.1 - August 8, 2015
- Added
ProductionFactory
interface to allow more lenient type-hinting within other packages. - Docblock cleanup.
0.1.0 - August 4, 2015
- Initial release.
License
Copyright (c) 2015 Jason Daly (deefour). Released under the MIT License.