laravelba/proxyvel 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

laravelba/proxyvel

Composer 安装命令:

composer require laravelba/proxyvel

包简介

Service proxy for laravel's IoC container

README 文档

README

An implementation of ProxyManager for Laravel.

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.

This package helps you by giving you proxies instead of real objects.

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

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.

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

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

// 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:

// 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.

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.

// 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.

统计信息

  • 总下载量: 99
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 3
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2015-02-19