2017 © Pedro Peláez
 

library proxyvel

Service proxy for laravel's IoC container

image

guiwoda/proxyvel

Service proxy for laravel's IoC container

  • Thursday, February 19, 2015
  • by guiwoda
  • Repository
  • 0 Watchers
  • 0 Stars
  • 2 Installations
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 1 Versions
  • 0 % Grown

The README.md

Proxyvel

An implementation of ProxyManager for Laravel., (*1)

Why?

When you do intensive constructor injection, a lot of objects will be needed in order to create your application. As php creates all your environment for each request, this is a lot of heavy lifting for php to do, and probably most of your object graph won't be used anyway., (*2)

This package helps you by giving you proxies instead of real objects., (*3)

For a way better explanation of this, read what @Ocramius has to say about it or head to the ProxyManager documentation, (*4)

Usage

Laravel's architecture is not flexible on the IoC container: The Illuminate\Foundation\Application object extends the Illuminate\Container\Container and that makes it hard to swap out., (*5)

This package provides two extensions, namely of Application and Container. You probably won't need both., (*6)

Also, this package provides a way to decide which objects will be proxied by the IoC container, through the Specification pattern:, (*7)

// Proxy all the things!
$specification = new Proxyvel\Specifications\ProxyEverything;

// Proxy by the given namespaces
$specification = new Proxyvel\Specifications\ProxyNamespace([
    'App\Services',
    'App\Repositories'
]);

// Proxy only the given cases / class names
$specification = new Proxyvel\Specifications\ProxyCases([
    // You can always proxy Laravel's services by using the key Laravel sets
    'db',
    // Proxy some concrete classes
    'App\Services\FooService',
    // And some interfaces
    'App\Contracts\FooRepositoryInterface'
]);

// Proxy by regular expression (powerful, but usually complex)
$specification = new Proxyvel\Specifications\ProxyByRegExp([
    '/Interface$/', '/^Abstract/'
]);

// Combine multiple specifications
$specification = new Proxyvel\Specifications\ProxyCollection([
    new Proxyvel\Specifications\ProxyCases(/* ... */),
    new Proxyvel\Specifications\ProxyNamespace(/* ... */),
]);

// Define by negation (for those of you who see the glass half-empty)
$specification = new Proxyvel\Specifications\ProxyNegator(
    new Proxyvel\Specifications\ProxyNamespace('App\Entities')
);

Usage in a Laravel project

There's no ServiceProvider here. You'll need to edit your bootstrap/start.php file, and replace the $app variable with this package's Application:, (*8)

// in bootstrap/start.php 
$app = new Proxyvel\Application;

// If you don't call this, the container will just defer to Laravel's default behavior
$app->setProxyConfiguration(
    // Example Specification, build the one you need here
    new Proxyvel\Specifications\ProxyEverything,
    // Only instances of AbstractLazyFactory are accepted for now
    new ProxyManager\Factory\LazyLoadingValueHolderFactory
);

In a Laravel project, every instance of Container is resolved with the initial Application, so that's the only thing you'll ever need., (*9)

Usage outside of a Laravel project

If you use Laravel's Container outside of a Laravel project, you'll need to instantiate this package's Container extension instead., (*10)

// Wherever you first instantiate it
$container = new Proxyvel\Container(
    // Example Specification, build the one you need here
    new Proxyvel\Specifications\ProxyEverything,
    // Only instances of AbstractLazyFactory are accepted for now
    new ProxyManager\Factory\LazyLoadingValueHolderFactory
);

Because of Liskov's substitution principle, this package's extension can be used in any place the Container is expected., (*11)

The Versions

19/02 2015

dev-master

9999999-dev

Service proxy for laravel's IoC container

  Sources   Download

MIT

The Requires

 

The Development Requires

by Guido Contreras Woda