deefour/producer

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# Producer

[![Build Status](https://travis-ci.org/deefour/producer.svg)](https://travis-ci.org/deefour/producer)
[![Packagist Version](http://img.shields.io/packagist/v/deefour/producer.svg)](https://packagist.org/packages/deefour/producer)
[![Code Climate](https://codeclimate.com/github/deefour/producer/badges/gpa.svg)](https://codeclimate.com/github/deefour/producer)
[![License](https://poser.pugx.org/deefour/producer/license)](https://packagist.org/packages/deefour/producer)

A small class factory.

## Getting Started

Run the following to add Producer to your project's `composer.json`. See [Packagist](https://packagist.org/packages/deefour/producer) for specific versions.

```bash
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

```php
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".


```php
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

```php
get_class($producer) . ucfirst($type)
```

This can be customized by implementing a `resolve()` method on the producer passed into the factory.

```php
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`.

```php
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.

```php
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

```php
new $producible($producer);
```

This can be customized by implementing a `make()` method on the producer passed into the factory.

```php
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](http://www.deefour.me) ([deefour](https://github.com/deefour)). Released under the [MIT License](http://deefour.mit-license.org/).