Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/zendframework/zend-stdlib/src/Hydrator/ClassMethods.php
Строк: 154
<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/zf2 for the canonical source repository
 * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace ZendStdlibHydrator;

use 
Traversable;
use 
ZendStdlibException;
use 
ZendStdlibArrayUtils;
use 
ZendStdlibHydratorFilterFilterComposite;
use 
ZendStdlibHydratorFilterFilterProviderInterface;
use 
ZendStdlibHydratorFilterGetFilter;
use 
ZendStdlibHydratorFilterHasFilter;
use 
ZendStdlibHydratorFilterIsFilter;
use 
ZendStdlibHydratorFilterMethodMatchFilter;
use 
ZendStdlibHydratorFilterOptionalParametersFilter;

class 
ClassMethods extends AbstractHydrator implements HydratorOptionsInterface
{
    
/**
     * Flag defining whether array keys are underscore-separated (true) or camel case (false)
     * @var bool
     */
    
protected $underscoreSeparatedKeys true;

    
/**
     * @var ZendStdlibHydratorFilterFilterInterface
     */
    
private $callableMethodFilter;

    
/**
     * Define if extract values will use camel case or name with underscore
     * @param bool|array $underscoreSeparatedKeys
     */
    
public function __construct($underscoreSeparatedKeys true)
    {
        
parent::__construct();
        
$this->setUnderscoreSeparatedKeys($underscoreSeparatedKeys);

        
$this->callableMethodFilter = new OptionalParametersFilter();

        
$this->filterComposite->addFilter("is", new IsFilter());
        
$this->filterComposite->addFilter("has", new HasFilter());
        
$this->filterComposite->addFilter("get", new GetFilter());
        
$this->filterComposite->addFilter("parameter", new OptionalParametersFilter(), FilterComposite::CONDITION_AND);
    }

    
/**
     * @param  array|Traversable                 $options
     * @return ClassMethods
     * @throws ExceptionInvalidArgumentException
     */
    
public function setOptions($options)
    {
        if (
$options instanceof Traversable) {
            
$options ArrayUtils::iteratorToArray($options);
        } elseif (!
is_array($options)) {
            throw new 
ExceptionInvalidArgumentException(
                
'The options parameter must be an array or a Traversable'
            
);
        }
        if (isset(
$options['underscoreSeparatedKeys'])) {
            
$this->setUnderscoreSeparatedKeys($options['underscoreSeparatedKeys']);
        }

        return 
$this;
    }

    
/**
     * @param  bool      $underscoreSeparatedKeys
     * @return ClassMethods
     */
    
public function setUnderscoreSeparatedKeys($underscoreSeparatedKeys)
    {
        
$this->underscoreSeparatedKeys $underscoreSeparatedKeys;

        return 
$this;
    }

    
/**
     * @return bool
     */
    
public function getUnderscoreSeparatedKeys()
    {
        return 
$this->underscoreSeparatedKeys;
    }

    
/**
     * Extract values from an object with class methods
     *
     * Extracts the getter/setter of the given $object.
     *
     * @param  object                           $object
     * @return array
     * @throws ExceptionBadMethodCallException for a non-object $object
     */
    
public function extract($object)
    {
        if (!
is_object($object)) {
            throw new 
ExceptionBadMethodCallException(sprintf(
                
'%s expects the provided $object to be a PHP object)'__METHOD__
            
));
        }

        
$filter null;
        if (
$object instanceof FilterProviderInterface) {
            
$filter = new FilterComposite(
                array(
$object->getFilter()),
                array(new 
MethodMatchFilter("getFilter"))
            );
        } else {
            
$filter $this->filterComposite;
        }

        
$transform = function ($letters) {
            
$letter array_shift($letters);

            return 
'_' strtolower($letter);
        };
        
$attributes = array();
        
$methods get_class_methods($object);

        foreach (
$methods as $method) {
            if (
                !
$filter->filter(
                    
get_class($object) . '::' $method
                
)
            ) {
                continue;
            }

            if (!
$this->callableMethodFilter->filter(get_class($object) . '::' $method)) {
                continue;
            }

            
$attribute $method;
            if (
preg_match('/^get/'$method)) {
                
$attribute substr($method3);
                if (!
property_exists($object$attribute)) {
                    
$attribute lcfirst($attribute);
                }
            }

            if (
$this->underscoreSeparatedKeys) {
                
$attribute preg_replace_callback('/([A-Z])/'$transform$attribute);
            }
            
$attributes[$attribute] = $this->extractValue($attribute$object->$method(), $object);
        }

        return 
$attributes;
    }

    
/**
     * Hydrate an object by populating getter/setter methods
     *
     * Hydrates an object by getter/setter methods of the object.
     *
     * @param  array                            $data
     * @param  object                           $object
     * @return object
     * @throws ExceptionBadMethodCallException for a non-object $object
     */
    
public function hydrate(array $data$object)
    {
        if (!
is_object($object)) {
            throw new 
ExceptionBadMethodCallException(sprintf(
                
'%s expects the provided $object to be a PHP object)'__METHOD__
            
));
        }

        
$transform = function ($letters) {
            
$letter substr(array_shift($letters), 11);

            return 
ucfirst($letter);
        };

        foreach (
$data as $property => $value) {
            
$method 'set' ucfirst($property);
            if (
$this->underscoreSeparatedKeys) {
                
$method preg_replace_callback('/(_[a-z])/i'$transform$method);
            }
            if (
is_callable(array($object$method))) {
                
$value $this->hydrateValue($property$value$data);
                
$object->$method($value);
            }
        }

        return 
$object;
    }
}
Онлайн: 0
Реклама