/** * Method creates an Inspector instance and a utility function ($first) to return the * first item in a metadata array. Next, it loops through all the properties in the model, * and sifts out all that have an @column flag. Any other properties are ignored at this point. * The column’s @type flag is checked to make sure it is valid, raising a * Model\Exception\Type in the event that it is not. If the column’s type is valid, * it is added to the $_columns property. Every valid $primary column leads to the * incrementing of the $primaries variable, which is checked at the end * of the method to make sure that exactly one primary column has been defined. * In essence, this method takes the User model definition and returns an associative array of column data * * @return array * @throws Exception\Type * @throws Exception\Primary */ public function getColumns() { if (empty($this->_columns)) { $primaries = 0; $columns = array(); $class = get_class($this); $types = $this->_types; $inspector = new Inspector($this); $properties = $inspector->getClassProperties(); $first = function ($array, $key) { if (!empty($array[$key]) && count($array[$key]) == 1) { return $array[$key][0]; } return null; }; foreach ($properties as $property) { $propertyMeta = $inspector->getPropertyMeta($property); if (!empty($propertyMeta['@column'])) { $name = preg_replace('#^_#', '', $property); $primary = !empty($propertyMeta['@primary']); $type = $first($propertyMeta, '@type'); $length = $first($propertyMeta, '@length'); $index = !empty($propertyMeta['@index']); $unique = !empty($propertyMeta['@unique']); $readwrite = !empty($propertyMeta['@readwrite']); $read = !empty($propertyMeta['@read']) || $readwrite; $write = !empty($propertyMeta['@write']) || $readwrite; $validate = !empty($propertyMeta['@validate']) ? $propertyMeta['@validate'] : false; $label = $first($propertyMeta, '@label'); if (!in_array($type, $types)) { throw new Exception\Type(sprintf('%s is not a valid type', $type)); } if ($primary) { $primaries++; } $columns[$name] = array('raw' => $property, 'name' => $name, 'primary' => $primary, 'type' => $type, 'length' => $length, 'index' => $index, 'unique' => $unique, 'read' => $read, 'write' => $write, 'validate' => $validate, 'label' => $label); } } if ($primaries !== 1) { throw new Exception\Primary(sprintf('%s must have exactly one @primary column', $primary)); } $this->_columns = $columns; } return $this->_columns; }