/** * @param callable $closure * @param array $args * * @return $this */ public function onSuccess(Closure $closure = NULL, $args = []) { $this->onSuccess = is_callable($closure) ? ['closure' => $closure, 'args' => Helpers_Arr::merge([$this], $args)] : NULL; return $this; }
/** * @param null|string $input * @param null|bool $parseFiles * * @return array */ public static function parseMultiPartContent($input = NULL, $parseFiles = NULL) { NULL !== $input or $input = static::current()->body(); NULL !== $parseFiles or $parseFiles = static::config('request.data.parseBodyFiles.enabled', FALSE); $data = []; $files = $parseFiles ? [] : NULL; // grab multipart boundary from content type header preg_match('/boundary=["]*([^"\\s;]+)/', $_SERVER['CONTENT_TYPE'], $matches); if (count($matches)) { $boundary = preg_quote($matches[1]); // split content by boundary and get rid of last -- element $blocks = preg_split("/-+{$boundary}/", $input); // loop data blocks foreach ($blocks as $block) { if (empty($block)) { continue; } $parts = preg_split('/[\\r\\n][\\r\\n]/', trim($block, "\r\n"), 2, PREG_SPLIT_NO_EMPTY); if (count($parts) != 2) { continue; } list($raw_headers, $input) = $parts; if (preg_match('/name="([^"]+)"(; *filename="([^"]+)")?/', $raw_headers, $matches)) { $name = rawurldecode($matches[1]); $filename = isset($matches[3]) ? $matches[3] : NULL; if (!isset($filename)) { $input = Helpers_Text::trimAsNULL($input); $_tmp = "{$name}={$input}"; $_data = NULL; parse_str($_tmp, $_data); $data = Helpers_Arr::merge($data, $_data); } elseif (isset($files)) { $_tmpname = tempnam(NULL, 'tmp'); if (FALSE !== $_tmpname) { if (preg_match('@^Content-Type:@im', $input)) { $input = trim(preg_replace('@^Content-Type:[^\\n]*@i', "", $input), "\r\n"); } file_put_contents($_tmpname, $input); chmod($_tmpname, static::config('request.data.parseBodyFiles.chmod', 0666)); $files[$name] = ['name' => $filename, 'type' => mime_content_type($_tmpname), 'tmp_name' => $_tmpname, 'error' => UPLOAD_ERR_OK, 'size' => filesize($_tmpname)]; } } } } if (Kohana_Helpers_Arr::count($files)) { foreach ($files as $fileKey => $fileInfo) { $_FILES[$fileKey] = $fileInfo; } if (static::config('request.data.parseBodyFiles.deleteOnShutdown', TRUE)) { register_shutdown_function(function () use($files) { foreach ($files as $row) { @unlink($row['tmp_name']); } }); } } } return $data; }
public static function makeRoute(RestfulAPI\Route $annotation, $defaults = []) { $defaults = Helpers_Arr::merge($annotation->defaults, $defaults, ['models' => $annotation->models]); return Route::set($annotation->name, $annotation->value, $annotation->regexp)->defaults($defaults)->filter([get_class(), 'route']); }
/** * @param mixed $value * @param array $validationRules * @param string $file Validation errors file (default: validation) * * @return mixed * @throws Validation_Exception */ protected function validateValue($value, array $validationRules = NULL, $file = NULL) { $validationRules = Helpers_Arr::merge([['not_empty']], NULL === $validationRules ? [] : $validationRules); $validation = Validation::factory(['key' => $value])->rules('key', $validationRules); if (!$validation->check()) { if (NULL === $file) { $file = 'validation'; } $errors = Kohana_Arr::flatten($validation->errors($file)); throw new Validation_Exception($validation, Kohana_Arr::get($errors, 'key', 'Undefined validation error')); } return $value; }