Overview

Classes

  • Papi_Admin
  • Papi_Admin_Ajax
  • Papi_Admin_Assets
  • Papi_Admin_Management_Pages
  • Papi_Admin_Menu
  • Papi_Admin_Meta_Box
  • Papi_Admin_Meta_Box_Tabs
  • Papi_Admin_Option_Handler
  • Papi_Admin_Post_Handler
  • Papi_Admin_View
  • Papi_Attachment_Type
  • Papi_Conditional_Rules
  • Papi_Container
  • Papi_Core_Autoload
  • Papi_Core_Conditional
  • Papi_Core_Conditional_Rule
  • Papi_Core_Data_Handler
  • Papi_Core_Page
  • Papi_Core_Property
  • Papi_Core_Type
  • Papi_Loader
  • Papi_Option_Page
  • Papi_Option_Type
  • Papi_Page_Type
  • Papi_Page_Type_Meta
  • Papi_Porter
  • Papi_Porter_Driver
  • Papi_Porter_Driver_Core
  • Papi_Post_Page
  • Papi_Property
  • Papi_Property_Bool
  • Papi_Property_Checkbox
  • Papi_Property_Color
  • Papi_Property_Datetime
  • Papi_Property_Divider
  • Papi_Property_Dropdown
  • Papi_Property_Editor
  • Papi_Property_Email
  • Papi_Property_File
  • Papi_Property_Flexible
  • Papi_Property_Gallery
  • Papi_Property_Hidden
  • Papi_Property_Html
  • Papi_Property_Image
  • Papi_Property_Link
  • Papi_Property_Number
  • Papi_Property_Post
  • Papi_Property_Radio
  • Papi_Property_Reference
  • Papi_Property_Relationship
  • Papi_Property_Repeater
  • Papi_Property_String
  • Papi_Property_Term
  • Papi_Property_Text
  • Papi_Property_Url
  • Papi_Property_User

Functions

  • current_page
  • papi
  • papi_action_delete_value
  • papi_action_include
  • papi_append_post_type_query
  • papi_body_class
  • papi_cache_delete
  • papi_cache_get
  • papi_cache_key
  • papi_cache_set
  • papi_camel_case
  • papi_cast_string_value
  • papi_convert_to_string
  • papi_current_user_is_allowed
  • papi_dashify
  • papi_delete_field
  • papi_delete_option
  • papi_delete_property_meta_value
  • papi_display_page_type
  • papi_doing_ajax
  • papi_esc_html
  • papi_f
  • papi_field
  • papi_field_shortcode
  • papi_field_value
  • papi_fields
  • papi_filter_conditional_rule_allowed
  • papi_filter_core_load_one_type_on
  • papi_filter_format_value
  • papi_filter_load_value
  • papi_filter_settings_directories
  • papi_filter_settings_only_page_type
  • papi_filter_settings_page_type_column_title
  • papi_filter_settings_show_page_type
  • papi_filter_settings_show_standard_page_type
  • papi_filter_settings_show_standard_page_type_in_filter
  • papi_filter_settings_sort_order
  • papi_filter_settings_standard_page_description
  • papi_filter_settings_standard_page_name
  • papi_filter_settings_standard_page_thumbnail
  • papi_filter_update_value
  • papi_from_property_array_slugs
  • papi_get_all_files_in_directory
  • papi_get_all_page_type_files
  • papi_get_all_page_types
  • papi_get_box_property
  • papi_get_class_name
  • papi_get_field
  • papi_get_file_path
  • papi_get_number_of_pages
  • papi_get_only_objects
  • papi_get_option
  • papi_get_options_and_properties
  • papi_get_or_post
  • papi_get_page
  • papi_get_page_new_url
  • papi_get_page_query_strings
  • papi_get_page_type
  • papi_get_page_type_base_path
  • papi_get_page_type_by_id
  • papi_get_page_type_by_post_id
  • papi_get_page_type_id
  • papi_get_page_type_key
  • papi_get_page_type_meta_value
  • papi_get_page_type_name
  • papi_get_page_type_template
  • papi_get_parent_post_id
  • papi_get_post_id
  • papi_get_post_type
  • papi_get_post_type_label
  • papi_get_post_types
  • papi_get_property_class_name
  • papi_get_property_meta_value
  • papi_get_property_options
  • papi_get_property_type
  • papi_get_property_type_key
  • papi_get_property_type_key_f
  • papi_get_qs
  • papi_get_sanitized_post
  • papi_get_slugs
  • papi_get_tab_options
  • papi_html_name
  • papi_html_tag
  • papi_include_template
  • papi_is_empty
  • papi_is_json
  • papi_is_method
  • papi_is_option_page
  • papi_is_option_type
  • papi_is_page_type
  • papi_is_property
  • papi_is_property_type_key
  • papi_is_rule
  • papi_management_page_type_render_box
  • papi_maybe_convert_to_array
  • papi_maybe_convert_to_object
  • papi_maybe_get_callable_value
  • papi_maybe_json_decode
  • papi_maybe_json_encode
  • papi_nl2br
  • papi_option_shortcode
  • papi_option_type_exists
  • papi_page_type_exists
  • papi_populate_properties
  • papi_property
  • papi_remove_papi
  • papi_remove_trailing_quotes
  • papi_render_html_tag
  • papi_render_properties
  • papi_render_property
  • papi_require_text
  • papi_required_html
  • papi_rule
  • papi_santize_data
  • papi_set_page_type_id
  • papi_setup_tabs
  • papi_slugify
  • papi_sort_order
  • papi_tab
  • papi_template
  • papi_template_include
  • papi_to_array
  • papi_to_property_array_slugs
  • papi_translate_keys
  • papi_underscorify
  • papi_update_field
  • papi_update_option
  • papi_update_property_meta_value
  • papi_with
  • papify
  • the_papi_field
  • the_papi_option
  • the_papi_page_type_name
  • Overview
  • Class
  1: <?php
  2: 
  3: /**
  4:  * Container class that implements a container.
  5:  */
  6: class Papi_Container implements ArrayAccess {
  7: 
  8:     /**
  9:      * The classes holder.
 10:      *
 11:      * @var array
 12:      */
 13:     protected $classes = [];
 14: 
 15:     /**
 16:      * The keys holder.
 17:      *
 18:      * @var array
 19:      */
 20:     protected $keys = [];
 21: 
 22:     /**
 23:      * The values holder.
 24:      *
 25:      * @var array
 26:      */
 27:     protected $values = [];
 28: 
 29:     /**
 30:      * Set a parameter or an object.
 31:      *
 32:      * @param string $id
 33:      * @param mixed  $value
 34:      * @param bool   $singleton
 35:      *
 36:      * @throws Exception when singleton cannot be rebind.
 37:      *
 38:      * @return mixed
 39:      */
 40:     public function bind( $id, $value = null, $singleton = false ) {
 41:         if ( is_string( $id ) && $this->is_singleton( $id ) ) {
 42:             throw new Exception( sprintf(
 43:                 'Identifier `%s` is a singleton and cannot be rebind',
 44:                 $id
 45:             ) );
 46:         }
 47: 
 48:         if ( is_object( $id ) && get_class( $id ) !== false ) {
 49:             $value = $id;
 50:             $id    = $this->get_class_prefix( get_class( $id ), false );
 51:             $this->classes[$id] = true;
 52:         }
 53: 
 54:         if ( $value instanceof Closure ) {
 55:             $closure = $value;
 56:         } else {
 57:             $closure = $this->get_closure( $value, $singleton );
 58:         }
 59: 
 60:         $this->values[$id] = compact( 'closure', 'singleton' );
 61:         $this->keys[$id] = true;
 62: 
 63:         return $value;
 64:     }
 65: 
 66:     /**
 67:      * Call closure.
 68:      *
 69:      * @param mixed $closure
 70:      * @param array $parameters
 71:      *
 72:      * @return Closure
 73:      */
 74:     protected function call_closure( $closure, array $parameters = [] ) {
 75:         if ( $closure instanceof Closure ) {
 76:             $rc      = new ReflectionFunction( $closure );
 77:             $args    = $rc->getParameters();
 78:             $params  = $parameters;
 79:             $classes = [
 80:                 $this->get_class_prefix( get_class( $this ) ),
 81:                 get_class( $this ),
 82:                 get_parent_class( $this )
 83:             ];
 84: 
 85:             foreach ( $args as $index => $arg ) {
 86:                 if ( $arg->getClass() === null ) {
 87:                     continue;
 88:                 }
 89: 
 90:                 if ( in_array( $arg->getClass()->name, $classes ) ) {
 91:                     $parameters[$index] = $this;
 92:                 } else if ( $this->exists( $arg->getClass()->name ) ) {
 93:                     $parameters[$index] = $this->make( $arg->getClass()->name );
 94:                 }
 95:             }
 96: 
 97:             if ( ! empty( $args ) && empty( $parameters ) ) {
 98:                 $parameters[0] = $this;
 99:             }
100: 
101:             if ( count( $args ) > count( $parameters ) ) {
102:                 $parameters = array_merge( $parameters, $params );
103:             }
104: 
105:             return $this->call_closure(
106:                 call_user_func_array( $closure, $parameters ),
107:                 $parameters
108:             );
109:         }
110: 
111:         return $closure;
112:     }
113: 
114:     /**
115:      * Check if identifier is set or not.
116:      *
117:      * @param string $id
118:      *
119:      * @return bool
120:      */
121:     public function exists( $id ) {
122:         return isset( $this->keys[$this->get_class_prefix( $id )] );
123:     }
124: 
125:     /**
126:      * Get closure function.
127:      *
128:      * @param mixed $value
129:      * @param bool $singleton
130:      *
131:      * @return Closure
132:      */
133:     protected function get_closure( $value, $singleton = false ) {
134:         return function () use ( $value, $singleton ) {
135:             return $value;
136:         };
137:     }
138: 
139:     /**
140:      * Get class prefix.
141:      *
142:      * @param string $id
143:      * @param bool   $check
144:      *
145:      * @return string
146:      */
147:     protected function get_class_prefix( $id, $check = true ) {
148:         if ( strpos( $id, '\\' ) !== false && $id[0] !== '\\' ) {
149:             $class = '\\' . $id;
150: 
151:             if ( $check ) {
152:                 return isset( $this->classes[$class] ) ? $class : $id;
153:             }
154: 
155:             return $class;
156:         }
157: 
158:         return $id;
159:     }
160: 
161:     /**
162:      * Determine if a given type is a singleton or not.
163:      *
164:      * @param string $id
165:      *
166:      * @throws InvalidArgumentException if argument is not string.
167:      *
168:      * @return bool
169:      */
170:     public function is_singleton( $id ) {
171:         if ( ! is_string( $id ) ) {
172:             throw new InvalidArgumentException( 'Invalid argument. Must be string.' );
173:         }
174: 
175:         if ( ! $this->exists( $id ) ) {
176:             return false;
177:         }
178: 
179:         $id = $this->get_class_prefix( $id );
180: 
181:         return $this->values[$id]['singleton'] === true;
182:     }
183: 
184:     /**
185:      * Resolve the given type from the container.
186:      *
187:      * @param string $id
188:      * @param array $parameters
189:      *
190:      * @throws Exception if identifier is not defined.
191:      *
192:      * @return Closure
193:      */
194:     public function make( $id, array $parameters = [] ) {
195:         if ( ! $this->exists( $id ) ) {
196:             throw new Exception( sprintf(
197:                 'Identifier `%s` is not defined',
198:                 $id
199:             ) );
200:         }
201: 
202:         $id      = $this->get_class_prefix( $id );
203:         $value   = $this->values[$id];
204:         $closure = $value['closure'];
205: 
206:         return $this->call_closure( $closure, $parameters );
207:     }
208: 
209:     /**
210:      * Unset value by identifier.
211:      *
212:      * @param string $id
213:      */
214:     public function remove( $id ) {
215:         $id = $this->get_class_prefix( $id );
216:         unset( $this->keys[$id], $this->values[$id] );
217:     }
218: 
219:     /**
220:      * Set a parameter or an object.
221:      *
222:      * @param string $id
223:      * @param mixed $value
224:      *
225:      * @return mixed
226:      */
227:     public function singleton( $id, $value = null ) {
228:         return $this->bind( $id, $value, true );
229:     }
230: 
231:     /**
232:      * Check if identifier is set or not.
233:      *
234:      * @codeCoverageIgnore
235:      *
236:      * @param string $id
237:      *
238:      * @return bool
239:      */
240:     public function offsetExists( $id ) {
241:         return $this->exists( $id );
242:     }
243: 
244:     /**
245:      * Get value by identifier.
246:      *
247:      * @codeCoverageIgnore
248:      *
249:      * @param string $id
250:      *
251:      * @return mixed
252:      */
253:     public function offsetGet( $id ) {
254:         return $this->make( $id );
255:     }
256: 
257:     /**
258:      * Set a parameter or an object.
259:      *
260:      * @codeCoverageIgnore
261:      *
262:      * @param string $id
263:      * @param mixed $value
264:      */
265:     public function offsetSet( $id, $value ) {
266:         $this->bind( $id, $value );
267:     }
268: 
269:     /**
270:      * Unset value by identifier.
271:      *
272:      * @codeCoverageIgnore
273:      *
274:      * @param string $id
275:      */
276:     public function offsetUnset( $id ) {
277:         $this->remove( $id );
278:     }
279: }
280: 
API documentation generated by ApiGen