Skip to content

Commit

Permalink
Updated
Browse files Browse the repository at this point in the history
  • Loading branch information
sorinsarca committed Dec 27, 2024
1 parent 59b83f3 commit 3c9e749
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 14 deletions.
77 changes: 77 additions & 0 deletions functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

namespace Opis\Closure;

use Opis\Closure\Security\SecurityProviderInterface;

/**
* @param Security\SecurityProviderInterface|string|null $security The security provider used to sign data
* @param bool $v3Compatible True if you need v3 compatibility at deserialization
* @return void
*/
function init(
Security\SecurityProviderInterface|string|null $security = null,
bool $v3Compatible = false
Expand All @@ -10,6 +17,68 @@ function init(
Serializer::init($security, $v3Compatible);
}

/**
* Changes the security provider
* @param Security\SecurityProviderInterface|string|null $security
* @return void
*/
function set_security_provider(Security\SecurityProviderInterface|string|null $security): void
{
Serializer::setSecurityProvider($security);
}

/**
* Get current security provider
* @return SecurityProviderInterface|null
*/
function get_security_provider(): ?Security\SecurityProviderInterface
{
return Serializer::getSecurityProvider();
}

/**
* Register a custom serializer for class
* @param string $class Class name
* @param callable(object): array $serialize Serialization function
* @param callable(array, callable(object, mixed): void, \ReflectionClass): object $unserialize Unserialization function
* @return void
*/
function register(
string $class,
callable $serialize,
callable $unserialize
): void
{
Serializer::register($class, $serialize, $unserialize);
}

/**
* Unregister a previously registered serializer
* @param string $class Class name
* @return void
*/
function unregister(string $class): void
{
Serializer::register($class, null, null);
}

/**
* Prevent serialization boxing for the specified classes.
* If you own the class, you should use Opis\Closure\Attribute\PreventBoxing attribute, instead of this function.
* @param string ...$classes
* @return void
*/
function prevent_boxing(string ...$classes): void
{
Serializer::preventBoxing(...$classes);
}

/**
* Serialize arbitrary data
* @param mixed $data The data to be serialized
* @param Security\SecurityProviderInterface|null $security Security provider used to sign the serialized data
* @return string Serialized data
*/
function serialize(
mixed $data,
?Security\SecurityProviderInterface $security = null
Expand All @@ -18,6 +87,14 @@ function serialize(
return Serializer::serialize($data, $security);
}

/**
* Unserialize data
* @param string $data Data to be deserialized
* @param Security\SecurityProviderInterface|array|null $security The security provider used to check the signature
* @param array|null $options Options for unserialization
* @return mixed The deserialized data
* @see https://www.php.net/manual/en/function.unserialize.php
*/
function unserialize(
string $data,
Security\SecurityProviderInterface|array|null $security = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
use Attribute;

#[Attribute(Attribute::TARGET_CLASS)]
class NoBox {}
class PreventBoxing {}
4 changes: 1 addition & 3 deletions src/Box.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

namespace Opis\Closure;

use Opis\Closure\Attribute\NoBox;

/**
* @internal
*/
#[NoBox]
#[Attribute\PreventBoxing]
final class Box
{
public const TYPE_CLOSURE = 1;
Expand Down
3 changes: 1 addition & 2 deletions src/ClassInfo.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace Opis\Closure;

use ReflectionClass;
use Opis\Closure\Attribute\NoBox;

/**
* @internal
Expand All @@ -28,7 +27,7 @@ class ClassInfo
public function __construct(string $className)
{
$reflection = $this->reflection = new ReflectionClass($className);
$this->box = empty($reflection->getAttributes(NoBox::class));
$this->box = empty($reflection->getAttributes(Attribute\PreventBoxing::class));
$this->hasMagicSerialize = $reflection->hasMethod("__serialize");
$this->hasMagicUnserialize = $reflection->hasMethod("__unserialize");
}
Expand Down
3 changes: 1 addition & 2 deletions src/ClosureInfo.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
namespace Opis\Closure;

use Closure;
use Opis\Closure\Attribute\NoBox;

#[NoBox]
#[Attribute\PreventBoxing]
final class ClosureInfo
{
public const FLAG_IS_SHORT = 1;
Expand Down
4 changes: 1 addition & 3 deletions src/PriorityWrapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,13 @@

namespace Opis\Closure;

use Opis\Closure\Attribute\NoBox;

/**
* In order to correctly unserialize closures we first have to
* unserialize objects so that bindings of closures to be already resolved.
* This is used only at the top level.
* @internal
*/
#[NoBox]
#[Attribute\PreventBoxing]
final class PriorityWrapper
{
public function __construct(
Expand Down
9 changes: 6 additions & 3 deletions src/Serializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -250,17 +250,20 @@ public static function getClassInfo(string $class): ClassInfo
* Prevent serialization boxing for specified classes
* @param string ...$class
* @return void
* @throws \ReflectionException
*/
public static function noBox(string ...$class): void
public static function preventBoxing(string ...$class): void
{
foreach ($class as $cls) {
self::getClassInfo($cls)->box = false;
}
}

/**
* Register custom serialization/deserialization for a class
* Register custom serialization & deserialization for a class
* @param string $class
* @param null|callable(object): array $serialize
* @param null|callable(array, callable(object, mixed): void, \ReflectionClass): object $unserialize
* @return void
*/
public static function register(string $class, ?callable $serialize, ?callable $unserialize): void
{
Expand Down

0 comments on commit 3c9e749

Please sign in to comment.