mirror of
https://github.com/wiosna-dev/common-library.git
synced 2026-03-12 09:31:51 +01:00
Utilities > Reflection > setPropertyValue() method > sets value of given property
This commit is contained in:
@@ -6,6 +6,7 @@ Common and useful classes, methods, exceptions etc.
|
||||
|
||||
1. Documentation > Value Objects
|
||||
2. Docker > improve performance
|
||||
3. Utilities > Reflection > setPropertyValue() method > sets value of given property
|
||||
|
||||
# 0.1.1
|
||||
|
||||
|
||||
33
src/Exception/Reflection/NotExistingPropertyException.php
Normal file
33
src/Exception/Reflection/NotExistingPropertyException.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Reflection;
|
||||
|
||||
/**
|
||||
* An exception used while property does not exist in instance of class
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class NotExistingPropertyException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param mixed $object Object that should contains given property
|
||||
* @param string $property Name of the property
|
||||
* @return NotExistingPropertyException
|
||||
*/
|
||||
public static function create($object, $property)
|
||||
{
|
||||
$template = 'Property \'%s\' does not exist in instance of class \'%s\'. Did you use proper name of property?';
|
||||
$message = sprintf($template, $property, get_class($object));
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ use Doctrine\Common\Util\Inflector;
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException;
|
||||
use Meritoo\Common\Exception\Reflection\MissingChildClassesException;
|
||||
use Meritoo\Common\Exception\Reflection\NotExistingPropertyException;
|
||||
use Meritoo\Common\Exception\Reflection\TooManyChildClassesException;
|
||||
|
||||
/**
|
||||
@@ -659,4 +660,36 @@ class Reflection
|
||||
|
||||
return $parentClass->getName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets value of given property
|
||||
*
|
||||
* @param mixed $object Object that should contains given property
|
||||
* @param string $property Name of the property
|
||||
* @param mixed $value Value of the property
|
||||
* @throws NotExistingPropertyException
|
||||
*/
|
||||
public static function setPropertyValue($object, $property, $value)
|
||||
{
|
||||
$reflectionProperty = self::getProperty($object, $property);
|
||||
|
||||
/*
|
||||
* Oops, property does not exist
|
||||
*/
|
||||
if (null === $reflectionProperty) {
|
||||
throw NotExistingPropertyException::create($object, $property);
|
||||
}
|
||||
|
||||
$notAccessible = $reflectionProperty->isPrivate() || $reflectionProperty->isProtected();
|
||||
|
||||
if ($notAccessible) {
|
||||
$reflectionProperty->setAccessible(true);
|
||||
}
|
||||
|
||||
$reflectionProperty->setValue($object, $value);
|
||||
|
||||
if ($notAccessible) {
|
||||
$reflectionProperty->setAccessible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ use Generator;
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException;
|
||||
use Meritoo\Common\Exception\Reflection\MissingChildClassesException;
|
||||
use Meritoo\Common\Exception\Reflection\NotExistingPropertyException;
|
||||
use Meritoo\Common\Exception\Reflection\TooManyChildClassesException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\A;
|
||||
@@ -474,6 +475,37 @@ class ReflectionTest extends BaseTestCase
|
||||
static::assertEquals('name', $property->getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $object Object that should contains given property
|
||||
* @param string $property Name of the property
|
||||
*
|
||||
* @dataProvider provideObjectAndNotExistingProperty
|
||||
*/
|
||||
public function testSetPropertyValueUsingNotExistingProperty($object, $property)
|
||||
{
|
||||
$this->setExpectedException(NotExistingPropertyException::class);
|
||||
|
||||
$object = new \stdClass();
|
||||
Reflection::setPropertyValue($object, 'test', 'test test test');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $object Object that should contains given property
|
||||
* @param string $property Name of the property
|
||||
* @param mixed $value Value of the property
|
||||
*
|
||||
* @dataProvider provideObjectPropertyAndValue
|
||||
*/
|
||||
public function testSetPropertyValue($object, $property, $value)
|
||||
{
|
||||
$oldValue = Reflection::getPropertyValue($object, $property);
|
||||
Reflection::setPropertyValue($object, $property, $value);
|
||||
$newValue = Reflection::getPropertyValue($object, $property);
|
||||
|
||||
static::assertNotSame($oldValue, $value);
|
||||
static::assertSame($newValue, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides invalid class and trait
|
||||
*
|
||||
@@ -501,4 +533,59 @@ class ReflectionTest extends BaseTestCase
|
||||
[],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides object and name of not existing property
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideObjectAndNotExistingProperty()
|
||||
{
|
||||
yield[
|
||||
new \stdClass(),
|
||||
'test',
|
||||
];
|
||||
|
||||
yield[
|
||||
new A(),
|
||||
'test',
|
||||
];
|
||||
|
||||
yield[
|
||||
new B(),
|
||||
'firstName',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides object, name of property and value of the property
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideObjectPropertyAndValue()
|
||||
{
|
||||
yield[
|
||||
new A(),
|
||||
'count',
|
||||
123,
|
||||
];
|
||||
|
||||
yield[
|
||||
new B(),
|
||||
'name',
|
||||
'test test',
|
||||
];
|
||||
|
||||
yield[
|
||||
new G(),
|
||||
'firstName',
|
||||
'Jane',
|
||||
];
|
||||
|
||||
yield[
|
||||
new G(),
|
||||
'lastName',
|
||||
'Smith',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user