parent
75afc67f31
commit
26488e5883
@ -0,0 +1,108 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
|
||||||
|
namespace App\Utils; |
||||||
|
|
||||||
|
|
||||||
|
use JsonSerializable; |
||||||
|
use MightyPork\Exceptions\NotApplicableException; |
||||||
|
use MightyPork\Utils\Utils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper class representing one column in a data table. |
||||||
|
* |
||||||
|
* @property-read string $name |
||||||
|
* @property-read string $title |
||||||
|
* @property-read string $type |
||||||
|
*/ |
||||||
|
class Column implements JsonSerializable |
||||||
|
{ |
||||||
|
const colTypes = [ |
||||||
|
'int', 'bool', 'float', 'string' |
||||||
|
]; |
||||||
|
|
||||||
|
private $name; |
||||||
|
private $title; |
||||||
|
private $type; |
||||||
|
|
||||||
|
public function __get($name) |
||||||
|
{ |
||||||
|
if (property_exists($this, $name)) { |
||||||
|
return $this->$name; |
||||||
|
} |
||||||
|
|
||||||
|
throw new NotApplicableException("No such column property"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create from object or array |
||||||
|
* |
||||||
|
* @param $obj |
||||||
|
*/ |
||||||
|
public function __construct($obj) |
||||||
|
{ |
||||||
|
$b = new \objBag($obj); |
||||||
|
$this->name = $b->name; |
||||||
|
$this->title = $b->title; |
||||||
|
$this->type = $b->type; |
||||||
|
|
||||||
|
if (!in_array($this->type, self::colTypes)) { |
||||||
|
throw new NotApplicableException("\"$this->type\" is not a valid column type."); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return array with keys {name, title, type} |
||||||
|
*/ |
||||||
|
public function toArray() |
||||||
|
{ |
||||||
|
return [ |
||||||
|
'name' => $this->name, |
||||||
|
'title' => $this->title, |
||||||
|
'type' => $this->type, |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Convert a value to the target type, validating it in the process |
||||||
|
* |
||||||
|
* @param mixed $value |
||||||
|
* @return bool|float|int|string |
||||||
|
*/ |
||||||
|
public function cast($value) |
||||||
|
{ |
||||||
|
switch ($this->type) { |
||||||
|
case 'int': |
||||||
|
if (is_int($value)) return $value; |
||||||
|
if (is_float($value)) return round($value); |
||||||
|
if (is_numeric($value)) return intval($value); |
||||||
|
throw new NotApplicableException("Could not convert value \"$value\" to int!"); |
||||||
|
|
||||||
|
case 'float': |
||||||
|
if (is_int($value) || is_float($value)) return (float)$value; |
||||||
|
if (is_numeric($value)) return floatval($value); |
||||||
|
throw new NotApplicableException("Could not convert value \"$value\" to float!"); |
||||||
|
|
||||||
|
case 'bool': |
||||||
|
return Utils::parseBool($value); |
||||||
|
|
||||||
|
case 'string': |
||||||
|
return "$value"; |
||||||
|
|
||||||
|
default: |
||||||
|
throw new \LogicException("Illegal column type: \"$this->type\""); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Specify data which should be serialized to JSON |
||||||
|
* @link http://php.net/manual/en/jsonserializable.jsonserialize.php |
||||||
|
* @return mixed data which can be serialized by <b>json_encode</b>, |
||||||
|
* which is a value of any type other than a resource. |
||||||
|
* @since 5.4.0 |
||||||
|
*/ |
||||||
|
public function jsonSerialize() |
||||||
|
{ |
||||||
|
return $this->toArray(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace MightyPork\Exceptions; |
||||||
|
|
||||||
|
/** |
||||||
|
* Something can't be used the way it was |
||||||
|
*/ |
||||||
|
class NotApplicableException extends RuntimeException |
||||||
|
{ |
||||||
|
// |
||||||
|
} |
Loading…
Reference in new issue