/** * Build a method signature * * @param \Zend\Server\Reflection\AbstractFunction $reflection * @param null|string|object $class * @return \Zend\Server\Method\Definition * @throws \Zend\Server\Exception on duplicate entry */ protected function _buildSignature(Reflection\AbstractFunction $reflection, $class = null) { $ns = $reflection->getNamespace(); $name = $reflection->getName(); $method = empty($ns) ? $name : $ns . '.' . $name; if (!$this->_overwriteExistingMethods && $this->_table->hasMethod($method)) { throw new Exception\RuntimeException('Duplicate method registered: ' . $method); } $definition = new Method\Definition(); $definition->setName($method)->setCallback($this->_buildCallback($reflection))->setMethodHelp($reflection->getDescription())->setInvokeArguments($reflection->getInvokeArguments()); foreach ($reflection->getPrototypes() as $proto) { $prototype = new Method\Prototype(); $prototype->setReturnType($this->_fixType($proto->getReturnType())); foreach ($proto->getParameters() as $parameter) { $param = new Method\Parameter(array('type' => $this->_fixType($parameter->getType()), 'name' => $parameter->getName(), 'optional' => $parameter->isOptional())); if ($parameter->isDefaultValueAvailable()) { $param->setDefaultValue($parameter->getDefaultValue()); } $prototype->addParameter($param); } $definition->addPrototype($prototype); } if (is_object($class)) { $definition->setObject($class); } $this->_table->addMethod($definition); return $definition; }
/** * Load methods as returned from {@link getFunctions} * * Typically, you will not use this method; it will be called using the * results pulled from {@link Zend\XmlRpc\Server\Cache::get()}. * * @param array|Definition $definition * @return void * @throws Server\Exception\InvalidArgumentException on invalid input */ public function loadFunctions($definition) { if (!is_array($definition) && !$definition instanceof Definition) { if (is_object($definition)) { $type = get_class($definition); } else { $type = gettype($definition); } throw new Server\Exception\InvalidArgumentException('Unable to load server definition; must be an array or Zend_Server_Definition, received ' . $type, 612); } $this->table->clearMethods(); $this->registerSystemMethods(); if ($definition instanceof Definition) { $definition = $definition->getMethods(); } foreach ($definition as $key => $method) { if ('system.' == substr($key, 0, 7)) { continue; } $this->table->addMethod($method, $key); } }
/** * Cache a file containing the dispatch list. * * Serializes the server definition stores the information * in $filename. * * Returns false on any error (typically, inability to write to file), true * on success. * * @param string $filename * @param \Zend\Server\Server $server * @return bool */ public static function save($filename, Server $server) { if (!is_string($filename) || !file_exists($filename) && !is_writable(dirname($filename))) { return false; } $methods = $server->getFunctions(); if ($methods instanceof Definition) { $definition = new Definition(); foreach ($methods as $method) { if (in_array($method->getName(), static::$skipMethods)) { continue; } $definition->addMethod($method); } $methods = $definition; } ErrorHandler::start(); $test = file_put_contents($filename, serialize($methods)); ErrorHandler::stop(); if (0 === $test) { return false; } return true; }
public function testDefinitionShouldSerializeToArray() { $method = array('name' => 'foo.bar', 'callback' => array('type' => 'function', 'function' => 'bar'), 'prototypes' => array(array('returnType' => 'string', 'parameters' => array('string'))), 'methodHelp' => 'Foo Bar!', 'invokeArguments' => array('foo')); $definition = new Server\Definition(); $definition->addMethod($method); $test = $definition->toArray(); $this->assertEquals(1, count($test)); $test = array_shift($test); $this->assertEquals($method['name'], $test['name']); $this->assertEquals($method['methodHelp'], $test['methodHelp']); $this->assertEquals($method['invokeArguments'], $test['invokeArguments']); $this->assertEquals($method['prototypes'][0]['returnType'], $test['prototypes'][0]['returnType']); }