Skip to content
This repository was archived by the owner on Sep 3, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions src/TypeCast/Handler/ObjectHandler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

declare(strict_types=1);

namespace Jasny\MetaCast\TypeCast\Handler;

use Jasny\TypeCast\Handler\ObjectHandler as BaseObjectHandler;
use Jasny\TypeCast\HandlerInterface;
use Jasny\MetaCast\MetaCast;

/**
* Type cast to an object of a specific class
*/
class ObjectHandler extends BaseObjectHandler
{
/**
* Instance of MetaCast
* @var MetaCast
**/
protected $metaCast;

/**
* Create class instance
*
* @param MetaCast $metaCast
*/
public function __construct(MetaCast $metaCast)
{
$this->metaCast = $metaCast;
}

/**
* Create object using __set_state.
*
* @param mixed $value
* @return object|mixed
*/
protected function createWithSetState($value)
{
$value = $this->metaCast->cast($this->class, $value);

return parent::createWithSetState($value);
}
}
60 changes: 60 additions & 0 deletions tests/TypeCast/Handler/ObjectHandlerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

namespace Jasny\MetaCast\Tests\TypeCast\Handler;

use Jasny\MetaCast\MetaCast;
use Jasny\MetaCast\TypeCast\Handler\ObjectHandler;
use PHPUnit\Framework\TestCase;

/**
* @covers Jasny\MetaCast\TypeCast\Handler\ObjectHandler
*/
class ObjectHandlerTest extends TestCase
{
/**
* Test 'cast' method in case when __set_state should be used
*/
public function testCast()
{
$class = $this->getObjectClass();
$data = ['x' => 'x_value', 'y' => 'y_value'];
$casted = ['x' => 'casted_x_value', 'y' => 'casted_y_value'];

$metaCast = $this->createMock(MetaCast::class);
$metaCast->expects($this->once())->method('cast')->with($class, $data)->willReturn($casted);

$handler = new ObjectHandler($metaCast);
$handler = $handler->forType($class);

$result = $handler->cast($data);

$this->assertInstanceOf($class, $result);
$this->assertSame($casted['x'], $result->x);
$this->assertSame($casted['y'], $result->y);
}

/**
* Get target class for casting
*
* @return string
*/
protected function getObjectClass()
{
$object = new class() {
public $x;
public $y;

public static function __set_state(array $data)
{
$foobar = new self();

if (isset($data['x'])) $foobar->x = $data['x'];
if (isset($data['y'])) $foobar->y = $data['y'];

return $foobar;
}
};

return get_class($object);
}
}