laipower/wp-content/plugins/easy-digital-downloads/includes/utils/class-registry.php

152 lines
3.2 KiB
PHP

<?php
/**
* Registry utility superclass
*
* This class should be extended to create object registries.
*
* @package EDD
* @subpackage Classes/Utilities
* @copyright Copyright (c) 2018, Easy Digital Downloads, LLC
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
* @since 3.0
*/
namespace EDD\Utils;
use EDD\Utils\Exceptions;
/**
* Defines the construct for building an item registry.
*
* @since 3.0.0
* @abstract
*/
abstract class Registry extends \ArrayObject {
/**
* Item error label.
*
* Used for customizing exception messages to the current registry instance. Default 'item'.
*
* @since 3.0
* @var string
*/
public static $item_error_label = 'item';
/**
* Adds an item to the registry.
*
* @since 3.0
*
* @throws \EDD_Exception If the `$attributes` array is empty.
*
* @param string $item_id Item ID.
* @param array $attributes Array of item attributes. Each extending registry will
* handle item ID and attribute building in different ways.
* @return bool True if `$attributes` is not empty, otherwise false.
*/
public function add_item( $item_id, $attributes ) {
$result = false;
if ( ! empty( $attributes ) ) {
$this->offsetSet( $item_id, $attributes );
$result = true;
} else {
$message = sprintf(
'The attributes were missing when attempting to add the \'%1$s\' %2$s.',
$item_id,
static::$item_error_label
);
throw new Exception( $message );
}
return $result;
}
/**
* Removes an item from the registry by ID.
*
* @since 3.0
*
* @param string $item_id Item ID.
*/
public function remove_item( $item_id ) {
if ( $this->offsetExists( $item_id ) ) {
$this->offsetUnset( $item_id );
}
}
/**
* Retrieves an item and its associated attributes.
*
* @since 3.0
*
* @throws \EDD_Exception if the item does not exist.
*
* @param string $item_id Item ID.
* @return array Array of attributes for the item if the item is set,
* otherwise an empty array.
*/
public function get_item( $item_id ) {
$item = array();
if ( $this->offsetExists( $item_id ) ) {
$item = $this->offsetGet( $item_id );
} else {
$message = sprintf(
'The \'%1$s\' %2$s does not exist.',
$item_id,
static::$item_error_label
);
throw new Exception( $message );
}
return $item;
}
/**
* Retrieves registered items.
*
* @since 3.0
*
* @return array The list of registered items.
*/
public function get_items() {
return $this->getArrayCopy();
}
/**
* Retrieves the value of a given attribute for a given item.
*
* @since 3.0
*
* @throws \EDD_Exception if the item does not exist.
* @throws \EDD_Exception if the attribute and/or item does not exist.
*
* @param string $key Key of the attribute to retrieve.
* @param string $item_id Collection to retrieve the attribute from.
* @return mixed|null The attribute value if set, otherwise null.
*/
public function get_attribute( $key, $item_id ) {
$attribute = null;
$item = $this->get_item( $item_id );
if ( ! empty( $item[ $key ] ) ) {
$attribute = $item[ $key ];
} else {
throw Exceptions\Attribute_Not_Found::from_attr( $key, $item_id );
}
return $attribute;
}
}