All Projects → yiisoft → proxy

yiisoft / proxy

Licence: BSD-3-Clause license
General purpose proxy

Programming Languages

PHP
23972 projects - #3 most used programming language

Projects that are alternatives of or similar to proxy

var-dumper
Helper for dumping variable for debug purposes
Stars: ✭ 13 (-23.53%)
Mutual labels:  yii3
yii-debug
Yii debug panel extension
Stars: ✭ 23 (+35.29%)
Mutual labels:  yii3
db-elasticsearch
Yii Framework Elasticsearch Query and ActiveRecord
Stars: ✭ 12 (-29.41%)
Mutual labels:  yii3
db-sqlite
SQLite support for Yii
Stars: ✭ 15 (-11.76%)
Mutual labels:  yii3
router
Router is a request matcher and URL generator
Stars: ✭ 38 (+123.53%)
Mutual labels:  yii3
data
Data providers
Stars: ✭ 31 (+82.35%)
Mutual labels:  yii3
demo
Yii 3 demo application
Stars: ✭ 259 (+1423.53%)
Mutual labels:  yii3
app
Yii 3 application template
Stars: ✭ 157 (+823.53%)
Mutual labels:  yii3
view-twig
Yii View Twig Renderer
Stars: ✭ 24 (+41.18%)
Mutual labels:  yii3
router-fastroute
Yii Router FastRoute adapter
Stars: ✭ 36 (+111.76%)
Mutual labels:  yii3
app-api
API application project template
Stars: ✭ 44 (+158.82%)
Mutual labels:  yii3
mutex
Mutex lock implementation
Stars: ✭ 28 (+64.71%)
Mutual labels:  yii3
data-response
www.yiiframework.com/
Stars: ✭ 12 (-29.41%)
Mutual labels:  yii3
yii-console
Yii console components
Stars: ✭ 48 (+182.35%)
Mutual labels:  yii3
yii-event
Events for Yii applications
Stars: ✭ 12 (-29.41%)
Mutual labels:  yii3
strings
String helper methods and an inflector
Stars: ✭ 31 (+82.35%)
Mutual labels:  yii3
db-redis
Yii DBAL Redis connection
Stars: ✭ 14 (-17.65%)
Mutual labels:  yii3
log-target-file
Yii Logging Library - File Target
Stars: ✭ 19 (+11.76%)
Mutual labels:  yii3
arrays
Yii Array Helper
Stars: ✭ 41 (+141.18%)
Mutual labels:  yii3
html
Handy library to generate HTML
Stars: ✭ 42 (+147.06%)
Mutual labels:  yii3

Yii Proxy


The package is able to build generic proxy for a class i.e. it allows intercepting all class method calls. It's used in yii-debug package to collect service's method calls information.

For license information check the LICENSE-file.

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

Installation

The preferred way to install this extension is through Сomposer.

composer require --prefer-dist yiisoft/proxy

Usage

Custom base proxy class

Custom base proxy class is useful to perform certain actions during each method call.

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;
    }
}

Additionally, you can customize new instance creation, etc. See examples in yii-debug extension.

Class with interface

Having an interface and class implementing it, the proxy can be created like this:

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

Class without interface

An interface is not required though, the proxy still can be created almost the same way:

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()]
);

Proxy class contents

Here is an example how proxy class looks internally:

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

Unit testing

The package is tested with PHPUnit. To run tests:

./vendor/bin/phpunit

Mutation testing

The package tests are checked with Infection mutation framework. To run it:

./vendor/bin/infection

Static analysis

The code is statically analyzed with Psalm. To run static analysis:

./vendor/bin/psalm

Support the project

Open Collective

Follow updates

Official website Twitter Telegram Facebook Slack

License

The Yiisoft Proxy is free software. It is released under the terms of the BSD License. Please see LICENSE for more information.

Maintained by Yii Software.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].