Merge branch '1.4' of https://github.com/getgrav/grav into 1.4

This commit is contained in:
Andy Miller
2018-01-09 22:47:15 -07:00
5 changed files with 142 additions and 36 deletions

View File

@@ -5,6 +5,9 @@
* Made `modular` blueprint more flexible
1. [](#bugfix)
* Date ordering should always be numeric [#1810](https://github.com/getgrav/grav/issues/1810)
1. [](#improved)
* Objects: Add protected function `getElement()` to get serialized value for a single property
* `ObjectPropertyTrait`: Added protected functions `isPropertyLoaded()`, `offsetLoad()`, `offsetPrepare()` and `offsetSerialize()`
# v1.4.0-beta.3
## 12/29/2017

View File

@@ -10,6 +10,9 @@ namespace Grav\Framework\Object\Property;
/**
* Array Property Trait
*
* Stores all object properties into an array.
*
* @package Grav\Framework\Object\Property
*/
trait ArrayPropertyTrait
@@ -48,7 +51,7 @@ trait ArrayPropertyTrait
*/
protected function &doGetProperty($property, $default = null, $doCreate = false)
{
if (!$this->doHasProperty($property)) {
if (!array_key_exists($property, $this->_elements)) {
if ($doCreate) {
$this->_elements[$property] = null;
} else {
@@ -61,7 +64,7 @@ trait ArrayPropertyTrait
/**
* @param string $property Object property to be updated.
* @param string $value New value.
* @param mixed $value New value.
*/
protected function doSetProperty($property, $value)
{
@@ -76,6 +79,16 @@ trait ArrayPropertyTrait
unset($this->_elements[$property]);
}
/**
* @param string $property
* @param mixed|null $default
* @return mixed|null
*/
protected function getElement($property, $default = null)
{
return array_key_exists($property, $this->_elements) ? $this->_elements[$property] : $default;
}
/**
* @return array
*/

View File

@@ -10,6 +10,15 @@ namespace Grav\Framework\Object\Property;
/**
* Lazy Mixed Property Trait
*
* Stores defined object properties as class member variables and the rest into an array. Object properties are lazy
* loaded from the array.
*
* You may define following methods for the member variables:
* - `$this->offsetLoad($offset, $value)` called first time object property gets accessed
* - `$this->offsetPrepare($offset, $value)` called on every object property set
* - `$this->offsetSerialize($offset, $value)` called when the raw or serialized object property value is needed
*
* @package Grav\Framework\Object\Property
*/
trait LazyPropertyTrait
@@ -20,12 +29,14 @@ trait LazyPropertyTrait
ArrayPropertyTrait::doGetProperty as getArrayProperty;
ArrayPropertyTrait::doSetProperty as setArrayProperty;
ArrayPropertyTrait::doUnsetProperty as unsetArrayProperty;
ArrayPropertyTrait::getElement as getArrayElement;
ArrayPropertyTrait::getElements as getArrayElements;
ArrayPropertyTrait::setElements insteadof ObjectPropertyTrait;
ObjectPropertyTrait::doHasProperty as hasObjectProperty;
ObjectPropertyTrait::doGetProperty as getObjectProperty;
ObjectPropertyTrait::doSetProperty as setObjectProperty;
ObjectPropertyTrait::doUnsetProperty as unsetObjectProperty;
ObjectPropertyTrait::getElement as getObjectElement;
ObjectPropertyTrait::getElements as getObjectElements;
}
@@ -56,7 +67,7 @@ trait LazyPropertyTrait
/**
* @param string $property Object property to be updated.
* @param string $value New value.
* @param mixed $value New value.
* @return $this
*/
protected function doSetProperty($property, $value)
@@ -82,6 +93,20 @@ trait LazyPropertyTrait
return $this;
}
/**
* @param string $property
* @param mixed|null $default
* @return mixed|null
*/
protected function getElement($property, $default = null)
{
if ($this->isPropertyLoaded($property)) {
return $this->getObjectElement($property, $default);
}
return $this->getArrayElement($property, $default);
}
/**
* @return array
*/

View File

@@ -10,6 +10,15 @@ namespace Grav\Framework\Object\Property;
/**
* Mixed Property Trait
*
* Stores defined object properties as class member variables and the rest into an array.
*
* You may define following methods for member variables:
* - `$this->offsetLoad($offset, $value)` called first time object property gets accessed
* - `$this->offsetPrepare($offset, $value)` called on every object property set
* - `$this->offsetSerialize($offset, $value)` called when the raw or serialized object property value is needed
*
* @package Grav\Framework\Object\Property
*/
trait MixedPropertyTrait
@@ -20,12 +29,14 @@ trait MixedPropertyTrait
ArrayPropertyTrait::doGetProperty as getArrayProperty;
ArrayPropertyTrait::doSetProperty as setArrayProperty;
ArrayPropertyTrait::doUnsetProperty as unsetArrayProperty;
ArrayPropertyTrait::getElement as getArrayElement;
ArrayPropertyTrait::getElements as getArrayElements;
ArrayPropertyTrait::setElements as setArrayElements;
ObjectPropertyTrait::doHasProperty as hasObjectProperty;
ObjectPropertyTrait::doGetProperty as getObjectProperty;
ObjectPropertyTrait::doSetProperty as setObjectProperty;
ObjectPropertyTrait::doUnsetProperty as unsetObjectProperty;
ObjectPropertyTrait::getElement as getObjectElement;
ObjectPropertyTrait::getElements as getObjectElements;
ObjectPropertyTrait::setElements as setObjectElements;
}
@@ -55,7 +66,7 @@ trait MixedPropertyTrait
/**
* @param string $property Object property to be updated.
* @param string $value New value.
* @param mixed $value New value.
* @return $this
*/
protected function doSetProperty($property, $value)
@@ -78,6 +89,20 @@ trait MixedPropertyTrait
return $this;
}
/**
* @param string $property
* @param mixed|null $default
* @return mixed|null
*/
protected function getElement($property, $default = null)
{
if ($this->hasObjectProperty($property)) {
return $this->getObjectElement($property, $default);
}
return $this->getArrayElement($property, $default);
}
/**
* @return array
*/

View File

@@ -10,6 +10,15 @@ namespace Grav\Framework\Object\Property;
/**
* Object Property Trait
*
* Stores all properties as class member variables or object properties. All properties need to be defined as protected
* properties. Undefined properties will throw an error.
*
* Additionally you may define following methods:
* - `$this->offsetLoad($offset, $value)` called first time object property gets accessed
* - `$this->offsetPrepare($offset, $value)` called on every object property set
* - `$this->offsetSerialize($offset, $value)` called when the raw or serialized object property value is needed
*
* @package Grav\Framework\Object\Property
*/
trait ObjectPropertyTrait
@@ -31,6 +40,51 @@ trait ObjectPropertyTrait
$this->setKey($key);
}
/**
* @param string $property Object property name.
* @return bool True if property has been loaded.
*/
protected function isPropertyLoaded($property)
{
return !empty($this->_definedProperties[$property]);
}
/**
* @param string $offset
* @param mixed $value
* @return mixed
*/
protected function offsetLoad($offset, $value)
{
$methodName = "offsetLoad_{$offset}";
return method_exists($this, $methodName)? $this->{$methodName}($value) : $value;
}
/**
* @param string $offset
* @param mixed $value
* @return mixed
*/
protected function offsetPrepare($offset, $value)
{
$methodName = "offsetPrepare_{$offset}";
return method_exists($this, $methodName) ? $this->{$methodName}($value) : $value;
}
/**
* @param string $offset
* @param mixed $value
* @return mixed
*/
protected function offsetSerialize($offset, $value)
{
$methodName = "offsetSerialize_{$offset}";
return method_exists($this, $methodName) ? $this->{$methodName}($value) : $value;
}
/**
* @param string $property Object property name.
* @return bool True if property has been defined (can be null).
@@ -58,7 +112,7 @@ trait ObjectPropertyTrait
$this->{$property} = null;
} elseif (is_callable($doCreate)) {
$this->_definedProperties[$property] = true;
$this->{$property} = $this->onPropertyLoad($property, $doCreate());
$this->{$property} = $this->offsetLoad($property, $doCreate());
} else {
return $default;
}
@@ -69,7 +123,7 @@ trait ObjectPropertyTrait
/**
* @param string $property Object property to be updated.
* @param string $value New value.
* @param mixed $value New value.
* @throws \InvalidArgumentException
*/
protected function doSetProperty($property, $value)
@@ -79,7 +133,7 @@ trait ObjectPropertyTrait
}
$this->_definedProperties[$property] = true;
$this->{$property} = $this->onPropertySet($property, $value);
$this->{$property} = $this->offsetPrepare($property, $value);
}
/**
@@ -95,29 +149,6 @@ trait ObjectPropertyTrait
unset($this->{$property});
}
protected function onPropertyLoad($offset, $value)
{
$methodName = "offsetLoad_{$offset}";
if (method_exists($this, $methodName)) {
return $this->{$methodName}($value);
}
return $value;
}
protected function onPropertySet($offset, $value)
{
$methodName = "offsetPrepare_{$offset}";
if (method_exists($this, $methodName)) {
return $this->{$methodName}($value);
}
return $value;
}
protected function initObjectProperties()
{
$this->_definedProperties = [];
@@ -128,6 +159,20 @@ trait ObjectPropertyTrait
}
}
/**
* @param string $property
* @param mixed|null $default
* @return mixed|null
*/
protected function getElement($property, $default = null)
{
if (empty($this->_definedProperties[$property])) {
return $default;
}
return $this->offsetSerialize($property, $this->{$property});
}
/**
* @return array
*/
@@ -137,12 +182,7 @@ trait ObjectPropertyTrait
$elements = [];
foreach ($properties as $offset => $value) {
$methodName = "offsetSerialize_{$offset}";
if (method_exists($this, $methodName)) {
$elements[$offset] = $this->{$methodName}($value);
} else {
$elements[$offset] = $value;
}
$elements[$offset] = $this->offsetSerialize($offset, $value);
}
return $elements;