. */ namespace SP\Mgmt; use SP\Config\Config; use SP\Core\DiFactory; use SP\Core\Exceptions\InvalidClassException; use SP\Core\Exceptions\SPException; use SP\Core\Session\Session; use SP\Core\Traits\InjectableTrait; use SP\DataModel\DataModelInterface; use SP\Storage\Database; /** * Class ItemBaseTrait * * @package SP\Mgmt */ trait ItemBaseTrait { use InjectableTrait; /** * @var string */ protected $dataModel; /** * @var mixed|DataModelInterface */ protected $itemData; /** @var Session */ protected $session; /** * Constructor. * * @param null $itemData * @throws InvalidClassException */ public function __construct($itemData = null) { $this->injectDependencies(); $this->init(); if (null !== $itemData) { $this->setItemData($itemData); } else { $this->itemData = new $this->dataModel(); } } /** * Devolver la instancia almacenada de la clase. Si no existe, se crea * * @param $itemData * @return static */ final public static function getItem($itemData = null) { return DiFactory::getItem(static::class, $itemData); } /** * Devolver una nueva instancia de la clase * * @param null $itemData * @return static * @throws \SP\Core\Exceptions\InvalidClassException */ final public static function getNewItem($itemData = null) { return new static($itemData); } /** * Devolver los datos del elemento * * @return mixed|DataModelInterface */ public function getItemData() { return is_object($this->itemData) ? $this->itemData : new $this->dataModel(); } /** * @param $itemData * @return $this * @throws InvalidClassException */ final public function setItemData($itemData) { if (null !== $this->dataModel && ($itemData instanceof $this->dataModel) === false) { throw new InvalidClassException(SPException::ERROR, $this->dataModel); } $this->itemData = $itemData; return $this; } /** * @return string */ public function getDataModel() { return $this->dataModel; } /** * @param string $dataModel * @return static * @throws InvalidClassException */ final protected function setDataModel($dataModel) { if (false === class_exists($dataModel)) { throw new InvalidClassException(SPException::ERROR, $dataModel); } $this->dataModel = $dataModel; return $this; } /** * @param Config $config * @param Database $db * @param Session $session */ public function inject(Config $config, Database $db, Session $session) { $this->ConfigData = $config->getConfigData(); $this->db = $db; $this->session = $session; } /** * Inicializar la clase * * @return void */ abstract protected function init(); }