Skip to content

Commit

Permalink
Merge pull request #107 from schmittjoh/compat-81
Browse files Browse the repository at this point in the history
Allows backward compatible support for the new __serialize and __unserialize methods
  • Loading branch information
goetas committed Nov 22, 2021
2 parents 3c5f34f + 194fa7a commit 4a3ec6f
Show file tree
Hide file tree
Showing 6 changed files with 141 additions and 115 deletions.
52 changes: 52 additions & 0 deletions UPGRADING.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,55 @@
From 2.2.3 to 2.3.0
====================

- The `\Serializable` PHP interface is deprecated, the methods of this interface will be removed in 3.0.
This change is done to allow the use of the new `__serialize` and `__unserialize` PHP's strategy.

If you were extending the metadata classes, your custom serialization methods were looking probably as something as this:

```php
class MyMetadata extends PropertyMetadata
{
// ... more code

public function serialize()
{
$data = parent::serialize();

return \serialize([$data, $this->customMetadataProp]);
}

public function unserialize($str)
{
list($str, $this->customMetadataProp) = \unserialize($str);

parent::unserialize($str);
}
}
```

After this change, your code should look like this:

```php
class MyMetadata extends PropertyMetadata
{
// ... more code

protected function serializeToArray(): array
{
$data = parent::serializeToArray();

return [$data, $this->customMetadataProp];
}

protected function unserializeFromArray(array $data): void
{
list($data, $this->customMetadataProp) = $data;

parent::unserializeFromArray($data);
}
}
```

From 1.7.0 to 2.0.0
====================

Expand Down
23 changes: 23 additions & 0 deletions phpcs.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,29 @@

</rule>

<rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingTraversableTypeHintSpecification">
<exclude-pattern>src/PropertyMetadata.php</exclude-pattern>
<exclude-pattern>src/MethodMetadata.php</exclude-pattern>
<exclude-pattern>src/ClassMetadata.php</exclude-pattern>
<exclude-pattern>src/SerializationHelper.php</exclude-pattern>
</rule>

<rule ref="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingTraversableTypeHintSpecification">
<exclude-pattern>src/PropertyMetadata.php</exclude-pattern>
<exclude-pattern>src/MethodMetadata.php</exclude-pattern>
<exclude-pattern>src/ClassMetadata.php</exclude-pattern>
<exclude-pattern>src/SerializationHelper.php</exclude-pattern>
</rule>


<rule ref="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint">
<exclude-pattern>src/SerializationHelper.php</exclude-pattern>
</rule>
<rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint">
<exclude-pattern>src/SerializationHelper.php</exclude-pattern>
</rule>


<rule ref="SlevomatCodingStandard.ControlStructures.RequireYodaComparison"/>

<rule ref="SlevomatCodingStandard.Commenting.ForbiddenAnnotations">
Expand Down
43 changes: 7 additions & 36 deletions src/ClassMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
*/
class ClassMetadata implements \Serializable
{
use SerializationHelper;

/**
* @var string
*/
Expand Down Expand Up @@ -74,56 +76,25 @@ public function isFresh(?int $timestamp = null): bool
return true;
}

/**
* @return string
*
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.UselessReturnAnnotation
*/
public function serialize()
protected function serializeToArray(): array
{
return serialize([
return [
$this->name,
$this->methodMetadata,
$this->propertyMetadata,
$this->fileResources,
$this->createdAt,
]);
];
}

/**
* @param string $str
*
* @return void
*
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.UselessReturnAnnotation
*/
public function unserialize($str)
protected function unserializeFromArray(array $data): void
{
[
$this->name,
$this->methodMetadata,
$this->propertyMetadata,
$this->fileResources,
$this->createdAt,
] = unserialize($str);
}

/**
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingTraversableTypeHintSpecification
*/
public function __serialize(): array
{
return [$this->serialize()];
}

/**
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingTraversableTypeHintSpecification
*/
public function __unserialize(array $data): void
{
$this->unserialize($data[0]);
] = $data;
}
}
54 changes: 12 additions & 42 deletions src/MethodMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
class MethodMetadata implements \Serializable
{
use SerializationHelper;

/**
* @var string
*/
Expand Down Expand Up @@ -46,48 +48,6 @@ public function invoke(object $obj, array $args = [])
return $this->getReflection()->invokeArgs($obj, $args);
}

/**
* @return string
*
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.UselessReturnAnnotation
*/
public function serialize()
{
return serialize([$this->class, $this->name]);
}

/**
* @param string $str
*
* @return void
*
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.UselessReturnAnnotation
*/
public function unserialize($str)
{
[$this->class, $this->name] = unserialize($str);
}

/**
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingTraversableTypeHintSpecification
*/
public function __serialize(): array
{
return [$this->serialize()];
}

/**
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingTraversableTypeHintSpecification
*/
public function __unserialize(array $data): void
{
$this->unserialize($data[0]);
}

/**
* @return mixed
*/
Expand Down Expand Up @@ -117,4 +77,14 @@ private function getReflection(): \ReflectionMethod

return $this->reflection;
}

protected function serializeToArray(): array
{
return [$this->class, $this->name];
}

protected function unserializeFromArray(array $data): void
{
[$this->class, $this->name] = $data;
}
}
44 changes: 7 additions & 37 deletions src/PropertyMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
*/
class PropertyMetadata implements \Serializable
{
use SerializationHelper;

/**
* @var string
*/
Expand All @@ -30,48 +32,16 @@ public function __construct(string $class, string $name)
$this->name = $name;
}

/**
* @return string
*
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.UselessReturnAnnotation
*/
public function serialize()
protected function serializeToArray(): array
{
return serialize([
return [
$this->class,
$this->name,
]);
}

/**
* @param string $str
*
* @return void
*
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.UselessReturnAnnotation
*/
public function unserialize($str)
{
[$this->class, $this->name] = unserialize($str);
];
}

/**
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingTraversableTypeHintSpecification
*/
public function __serialize(): array
{
return [$this->serialize()];
}

/**
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingTraversableTypeHintSpecification
*/
public function __unserialize(array $data): void
protected function unserializeFromArray(array $data): void
{
$this->unserialize($data[0]);
[$this->class, $this->name] = $data;
}
}
40 changes: 40 additions & 0 deletions src/SerializationHelper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

declare(strict_types=1);

namespace Metadata;

trait SerializationHelper
{
/**
* @deprecated Use serializeToArray
*
* @return string
*/
public function serialize()
{
return serialize($this->serializeToArray());
}

/**
* @deprecated Use unserializeFromArray
*
* @param string $str
*
* @return void
*/
public function unserialize($str)
{
$this->unserializeFromArray(unserialize($str));
}

public function __serialize(): array
{
return $this->serializeToArray();
}

public function __unserialize(array $data): void
{
$this->unserializeFromArray($data);
}
}

0 comments on commit 4a3ec6f

Please sign in to comment.