yiisoft/proxy

1.0.5 2023-01-17 13:21 UTC

README

Yii

Yii 代理


Latest Stable Version Total Downloads Build status Scrutinizer Code Quality Code Coverage Mutation testing badge static analysis type-coverage

该包能够为类构建通用的代理,即允许拦截所有类方法调用。它在 yii-debug 包中用于收集服务的调用信息。

要求

  • PHP 8.0 或更高版本。

安装

该包可以通过 Composer 安装。

composer require yiisoft/proxy

通用用法

自定义基础代理类

自定义基础代理类可以在每次方法调用期间执行某些操作。

use Yiisoft\Proxy\ObjectProxy;

class MyProxy extends ObjectProxy
{
    protected function afterCall(string $methodName, array $arguments, mixed $result, float $timeStart) : mixed {
        $result = parent::afterCall($methodName, $arguments, $result, $timeStart);
        
        $error = $this->getCurrentError(); // Use to track and handle errors. 
        $time = microtime(true) - $timeStart; // Use to measure / log execution time.
        
        return $result;
    }
}

此外,您还可以自定义新实例的创建等。请参阅 示例,这些示例位于 yii-debug 扩展中。

具有接口的类

有一个接口和实现它的类,代理可以创建如下所示

use Yiisoft\Proxy\ProxyManager;

interface CarInterface
{
    public function horsepower(): int;
}

class Car implements CarInterface
{
    public function horsepower(): int
    {
        return 1;
    }
}

$path = sys_get_temp_dir();
$manager = new ProxyManager(
    // This is optional. The proxy can be created "on the fly" instead. But it's recommended to specify path to enable
    // caching.
    $path
);
/** @var Car|MyProxy $object */
$object = $manager->createObjectProxy(
    CarInterface::class,
    MyProxy::class, // Custom base proxy class defined earlier.
    [new Car()]
);
// Now you can call `Car` object methods through proxy the same as you would call it in original `Car` object.
$object->horsepower(); // Outputs "1".

无接口的类

尽管不需要接口,但代理仍然可以以几乎相同的方式创建

use Yiisoft\Proxy\ProxyManager;

class Car implements CarInterface
{
    public function horsepower(): int
    {
        return 1;
    }
}

$path = sys_get_temp_dir();
$manager = new ProxyManager($path);
/** @var Car|MyProxy $object */
$object = $manager->createObjectProxy(
    Car::class, // Pass class instead of interface here. 
    MyProxy::class, 
    [new Car()]
);

代理类内容

以下是一个代理类内部的示例

class CarProxy extends MyProxy implements CarInterface
{
    public function horsepower(): int
    {
        return $this->call('horsepower', []);
    }
}

文档

如果您需要帮助或有问题,请访问 Yii 论坛,那里是一个很好的地方。您还可以查看其他 Yii 社区资源

许可

Yii 代理是自由软件。它根据 BSD 许可证的条款发布。有关更多信息,请参阅 LICENSE

Yii 软件 维护。

支持项目

Open Collective

关注更新

Official website Twitter Telegram Facebook Slack