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