guanguans / laravel-proxy-manager
Laravel 的代理管理器集成。 - 代理管理器集成用于 Laravel。
1.2.0
2024-03-13 09:20 UTC
Requires
- php: >=7.4
- illuminate/console: ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0
- illuminate/support: ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0
- ocramius/proxy-manager: ^1.0 || ^2.0 || ^3.0
- spatie/laravel-package-tools: ^1.12
Requires (Dev)
- brainmaestro/composer-git-hooks: ^2.8
- codedungeon/phpunit-result-printer: ^0.32
- composer/composer: ^2.7
- dms/phpunit-arraysubset-asserts: ^0.5
- ergebnis/composer-normalize: ^2.42
- friendsofphp/php-cs-fixer: ^3.51
- guanguans/ai-commit: dev-main
- guanguans/monorepo-builder-worker: ^1.4
- jetbrains/phpstorm-attributes: ^1.0
- johnkary/phpunit-speedtrap: ^4.0
- kylekatarnls/update-helper: ^1.2
- laminas/laminas-xmlrpc: ^2.14
- mockery/mockery: ^1.6
- nikic/php-parser: ^4.18 || ^5.0
- nyholm/nsa: ^1.3
- orchestra/testbench: ^5.0 || ^6.0 || ^7.0
- pestphp/pest: ^1.23 || ^2.0
- pestphp/pest-plugin-faker: ^1.0 || ^2.0
- pestphp/pest-plugin-laravel: ^1.2
- phpunit/phpunit: ^9.6 || ^10.0 || ^11.0
- povils/phpmnd: ^3.4
- rector/rector: ^1.0
- roave/security-advisories: dev-latest
- vimeo/psalm: ^5.23
Suggests
- nikic/php-parser: Required to use the `proxy:list` command.
README
Proxy Manager 集成于 Laravel。 - Laravel 的代理管理器集成。
特性
- 快速创建不同类型的代理实例。
- 快速将不同类型的代理实例绑定到容器。
- 快速扩展到不同类型的代理实例到容器。
要求
- PHP >= 7.4
- Laravel >= 7.0
安装
$ composer require guanguans/laravel-proxy-manager -vvv
$ php artisan vendor:publish --provider="Guanguans\\LaravelProxyManager\\ProxyManagerServiceProvider"
使用
获取代理管理器实例
app(\Guanguans\LaravelProxyManager\ProxyManager::class); resolve(\Guanguans\LaravelProxyManager\ProxyManager::class);
代理管理器门面方法
<?php namespace Guanguans\LaravelProxyManager\Facades; /** * Create proxy. * @method static \ProxyManager\Proxy\AccessInterceptorInterface createAccessInterceptorScopeLocalizerProxy(object $instance, array $prefixInterceptors = [], array $suffixInterceptors = []) * @method static \ProxyManager\Proxy\AccessInterceptorValueHolderInterface createAccessInterceptorValueHolderProxy(object $instance, array $prefixInterceptors = [], array $suffixInterceptors = []) * @method static \ProxyManager\Proxy\GhostObjectInterface createLazyLoadingGhostFactoryProxy(string $className, \Closure $initializer, array $proxyOptions = []) * @method static \ProxyManager\Proxy\VirtualProxyInterface createLazyLoadingValueHolderProxy(string $className, \Closure $initializer, array $proxyOptions = []) * @method static \ProxyManager\Proxy\NullObjectInterface createNullObjectProxy($instanceOrClassName) * @method static \ProxyManager\Proxy\RemoteObjectInterface createRemoteObjectProxy($instanceOrClassName, ?\ProxyManager\Factory\RemoteObject\AdapterInterface $adapter = null) * * Bind proxy. * @method static void singletonLazyLoadingValueHolderProxy(string $className, ?\Closure $concrete = null) * @method static void bindLazyLoadingValueHolderProxy(string $className, ?\Closure $concrete = null, bool $shared = false) * @method static void singletonNullObjectProxy(string $className) * @method static void bindNullObjectProxy(string $className, bool $shared = false) * @method static void singletonRemoteObjectProxy(string $className, ?\ProxyManager\Factory\RemoteObject\AdapterInterface $adapter = null) * @method static void bindRemoteObjectProxy(string $className, ?\ProxyManager\Factory\RemoteObject\AdapterInterface $adapter = null, bool $shared = false) * * Extend to proxy. * @method static void extendToAccessInterceptorScopeLocalizerProxy(string $abstract, array $prefixInterceptors = [], array $suffixInterceptors = []) * @method static void extendToAccessInterceptorValueHolderProxy(string $abstract, array $prefixInterceptors = [], array $suffixInterceptors = []) * @method static void extendToLazyLoadingGhostFactoryProxy(string $abstract, \Closure $initializer, array $proxyOptions = []) * @method static void extendToLazyLoadingValueHolderProxy(string $abstract, \Closure $initializer, array $proxyOptions = []) * @method static void extendToNullObjectProxy(string $abstract) * @method static void extendToRemoteObjectProxy(string $abstract, ?\ProxyManager\Factory\RemoteObject\AdapterInterface $adapter = null) * * @see \Guanguans\LaravelProxyManager\ProxyManager */ class ProxyManager{}
绑定虚拟代理示例(懒加载)
<?php namespace App; use App\Foo; use Guanguans\LaravelProxyManager\Facades\ProxyManager; use SebastianBergmann\Timer\ResourceUsageFormatter; use SebastianBergmann\Timer\Timer; class Foo { /** @var string */ private $bar; public function __construct(string $bar = 'bar') { $this->bar = $bar; sleep(3); } public function getBar(): string { return $this->bar; } } //ProxyManager::bindLazyLoadingValueHolderProxy(Foo::class); ProxyManager::singletonLazyLoadingValueHolderProxy(Foo::class); $formatter = new ResourceUsageFormatter(); $timer = new Timer(); $timer->start(); $timer->start(); // The constructor of the original class is not triggered when the proxy class is initialized dump($foo = app(Foo::class), $formatter->resourceUsage($timer->stop())); // The constructor of the original class will only be triggered when it is actually called dump($foo->getBar(), $formatter->resourceUsage($timer->stop()));
ProxyManagerGeneratedProxy\__PM__\App\Foo\Generated5320f6306ba550844e07c949e4af382d - App\Foo@proxy {#774 -valueHolder1cdad: null -initializer7920c: Closure(?object &$wrappedObject, ?object $proxy, string $method, array $parameters, ?Closure &$initializer) {#758 class: "Guanguans\LaravelProxyManager\ProxyManager" this: Guanguans\LaravelProxyManager\ProxyManager {#755 …} use: { $className: "App\Foo" $classArgs: [] } file: "/Users/yaozm/Documents/develop/laravel-proxy-manager/src/ProxyManager.php" line: "282 to 287" } } "Time: 00:00.008, Memory: 20.00 MB" "bar" "Time: 00:03.025, Memory: 22.00 MB"
扩展到访问拦截器值持有者代理示例(面向切面编程)
ProxyManager::extendToAccessInterceptorValueHolderProxy( LogManager::class, [ 'error' => static function ( object $proxy, LogManager $realInstance, string $method, array $parameters, bool &$returnEarly ){ dump('Before executing the error log method.'); } ], [ 'error' => static function ( object $proxy, LogManager $realInstance, string $method, array $parameters, &$returnValue, bool &$overrideReturnValue ){ dump('After executing the error log method.'); } ] ); dump($logger = app(LogManager::class)); $logger->error('What happened?');
ProxyManagerGeneratedProxy\__PM__\Illuminate\Log\LogManager\Generated9b66c8f3bc457c2c26acc55874d391b3 - Illuminate\Log\LogManager@proxy {#298 ▼ -valueHolder8f21a: Illuminate\Log\LogManager {#168 ▼ #app: Illuminate\Foundation\Application {#6 ▶} #channels: [] #customCreators: array:1 [▶] #dateFormat: "Y-m-d H:i:s" #levels: array:8 [▶] } -methodPrefixInterceptors8d709: array:1 [▼ "error" => Closure(object $proxy, LogManager $realInstance, string $method, array $parameters, bool &$returnEarly) {#280 ▶} ] -methodSuffixInterceptors2a12b: array:1 [▼ "error" => Closure(object $proxy, LogManager $realInstance, string $method, array $parameters, &$returnValue, bool &$overrideReturnValue) {#278 ▶} ] } "Before executing the error log method." "After executing the error log method."
命令
$ php artisan proxy:list $ php artisan proxy:clear
╰─ php artisan proxy:list ─╯ +-------+---------------------------+-------------------------------------------+---------------------------------+ | Index | Original Class | Proxy Class | Proxy Type | +-------+---------------------------+-------------------------------------------+---------------------------------+ | 1 | App\Foo | Generated5320f6306ba550844e07c949e4af382d | Virtual Proxy | | 2 | Illuminate\Log\LogManager | Generated9b66c8f3bc457c2c26acc55874d391b3 | Access Interceptor Value Holder | +-------+---------------------------+-------------------------------------------+---------------------------------+
测试
$ composer test
变更日志
请查看 CHANGELOG 了解最近的变化。
贡献
请查看 CONTRIBUTING 了解详情。
安全漏洞
请审查 我们的安全策略 了解如何报告安全漏洞。
致谢
许可证
MIT 许可证 (MIT)。请参阅 许可证文件 了解更多信息。