vendor/lm/entity/src/Common/Entity.php line 187

Open in your IDE?
  1. <?php
  2. namespace Lm\Entity\Common;
  3. use Lm\Service\Cache\CacheService;
  4. use Lm\Service\Cache\LmCacheTrait;
  5. use Lm\Util\Str;
  6. class Entity
  7. {
  8.     use LmCacheTrait {
  9.         LmCacheTrait::__construct as __constructLmCacheTrait;
  10.     }
  11.     const DATE_FORMAT_DEFAULT 'Y-m-d';
  12.     const DATE_TIME_FORMAT_DEFAULT self::DATE_FORMAT_DEFAULT.' H:i:s';
  13.     /**
  14.      * @var bool 算出プロパティの値を自動的に算出する
  15.      */
  16.     protected static $autoCompute true;
  17.     /**
  18.      * @var bool 算出済みの値をキャッシュする
  19.      */
  20.     protected static $cacheComputed true;
  21.     /**
  22.      * @var bool 空配列による初期化を許容
  23.      */
  24.     protected $allowEmpty false;
  25.     /**
  26.      * @var array
  27.      */
  28.     protected $data = [];
  29.     /**
  30.      * @param array $data
  31.      * @throws \Exception
  32.      */
  33.     public function __construct($data = [])
  34.     {
  35.         //
  36.         $this->__constructLmCacheTrait(new CacheService());
  37.         //
  38.         if (($message $this->validate($data)) !== true) {
  39.             //
  40.             throw new \Exception("無効なデータが指定されました\n{$message}");
  41.         }
  42.         //
  43.         $this->data array_merge($this->data$data);
  44.         //
  45.         $this->convert($data);
  46.     }
  47.     /**
  48.      * @param array $data
  49.      * @param array $errors
  50.      * @return bool|string
  51.      */
  52.     public function validate($data)
  53.     {
  54.         //
  55.         if ($this->allowEmpty && is_array($data) && empty($data)) {
  56.             // 空配列による初期化を許容
  57.             return true;
  58.         } else if (empty($data)) {
  59.             //
  60.             return 'データがありません';
  61.         }
  62.         // TODO: 実際の処理
  63.         //
  64.         return true;
  65.     }
  66.     /**
  67.      * @param array $data
  68.      * @return void
  69.      */
  70.     public function convert(array $data)
  71.     {
  72.         foreach ($data as $key => $value) {
  73.             //
  74.             // // $property = Str::snakeToCamel($key);
  75.             if (preg_match('/^[a-z]/i'$key)) {
  76.                 //
  77.                 if (strpos($key'_') !== false) {
  78.                     $key Str::snakeToCamel($key);
  79.                 }
  80.                 //
  81.                 if (strpos($key'-') !== false) {
  82.                     $key Str::kebabToCamel($key);
  83.                 }
  84.             }
  85.             //
  86.             $property $key;
  87.             //
  88.             if (property_exists($this$property)) {
  89.                 //
  90.                 $this->{$property} = $value;
  91.             }
  92.         }
  93.     }
  94.     /**
  95.      * TODO: 動的なプロパティ値への対応
  96.      * @return array
  97.      */
  98.     public function toArray()
  99.     {
  100.         return $this->data;
  101.     }
  102.     protected function allowEmpty()
  103.     {
  104.         $this->allowEmpty true;
  105.     }
  106.     /**
  107.      * Null許容int型(?int)のポリフィル関数。
  108.      * nullはnullのまま返すが、それ以外はint型にキャストした値を返す。
  109.      * ※原則として、Entityのint型Getterメソッドの返却値はこのメソッドを通すこと。
  110.      *
  111.      * @param int|null $var
  112.      * @return int|null
  113.      */
  114.     protected static function intNullable($var)
  115.     {
  116.         return ctype_digit($var) ? (($var !== null) ? (int)$var null) : $var;
  117.     }
  118.     /**
  119.      * @return $this
  120.      */
  121.     public function disableAutoCompute()
  122.     {
  123.         //
  124.         static::$autoCompute false;
  125.         //
  126.         return $this;
  127.     }
  128.     /**
  129.      * @return $this
  130.      */
  131.     public function enableAutoCompute()
  132.     {
  133.         //
  134.         static::$autoCompute true;
  135.         //
  136.         return $this;
  137.     }
  138.     /**
  139.      * @return $this
  140.      */
  141.     public function disableCacheComputed()
  142.     {
  143.         //
  144.         static::$cacheComputed false;
  145.         //
  146.         return $this;
  147.     }
  148.     /**
  149.      * @return $this
  150.      */
  151.     public function enableCacheComputed()
  152.     {
  153.         //
  154.         static::$cacheComputed true;
  155.         //
  156.         return $this;
  157.     }
  158.     /**
  159.      * @param mixed $var
  160.      * @param callable $callback
  161.      * @return mixed
  162.      */
  163.     protected static function compute(&$var$callback)
  164.     {
  165.         //
  166.         if (static::$autoCompute) {
  167.             //
  168.             if (!static::$cacheComputed || !isset($var)) {
  169.                 //
  170.                 $var $callback();
  171.             }
  172.         }
  173.         //
  174.         return $var;
  175.     }
  176.     /**
  177.      * @param Entity|array $data
  178.      * @param string|null $className
  179.      * @return Entity
  180.      * @throws \Exception
  181.      */
  182.     public static function factory($data$className null)
  183.     {
  184.         //
  185.         if ($className === null) {
  186.             //
  187.             $className = static::class;
  188.         }
  189.         //
  190.         if (is_array($data)) {
  191.             //
  192.             return new $className($data);
  193.         } else if ($className === get_class($data)) {
  194.             // 型名が完全に一致する場合、そのまま返す
  195.             return $data;
  196.         } else if ($data instanceof Entity) {
  197.             // 親子関係のクラスである場合、データを配列として取得してインスタンス化する
  198.             return new $className($data->toArray());
  199.         } else {
  200.             throw new \InvalidArgumentException();
  201.         }
  202.     }
  203. }