settings = $settings; return $this; } /** * Delete Structure * * @param string $name * @param string $type = 'controller' * @param string $app = NULL * * @return bool */ public function delete(string $name, string $type = 'controller', ?string $app = NULL) : bool { if( ! empty($app) ) { $this->settings['application'] = $app; // @codeCoverageIgnore } $file = $this->path($name, $type); if( is_file($file) ) { return unlink($file); } return false; // @codeCoverageIgnore } /** * Generate Object * * @param string $type * @param string $name * @param array $settings * * @return bool */ public function object(string $type, string $name, array $settings) : bool { if( ! empty($settings) ) { $this->settings = $settings; } if( empty($name) ) { $this->error = Errors::message('Error', 'emptyParameter', '1.(name)'); // @codeCoverageIgnore } # Start Generate $controller = "settings['object'] = $this->settings['object'] ?? 'class'; # Namespace Data $this->namespace($controller, $namespace); # Uses Data $this->uses($controller); # Class Name if( ! empty($this->settings['name']) ) { $name = $this->settings['name']; // @codeCoverageIgnore } $controller .= $this->settings['object']." ".$name; # Extends Data $this->extends($controller); # Implements Data $this->implements($controller); # Start Body $controller .= EOL . "{" . EOL; # Traits Data $this->traits($controller); # Constants Data $this->constants($controller); # Vars Data $this->vars($controller); # Functions Data $this->functions($controller); # Finish Class $controller = rtrim($controller, EOL) . EOL . "}"; # Alias Data $this->alias($controller, $namespace); # File Write return $this->write($name, $type, $controller); } /** * Protected Path */ protected function path($name, $type) { if( empty($this->settings['application']) ) { $this->settings['application'] = Datatype::divide(rtrim(PROJECT_DIR, '/'), '/', -1); } return PROJECTS_DIR.Base::suffix($this->settings['application']).$this->type($type).Base::suffix($name, '.php'); } /** * Protected Write * * @param string $name * @param string $type * @param string $controller * * @return bool */ protected function write($name, $type, $controller) : bool { if( ! empty($name) ) { if( ! empty($this->settings['path']) ) { $filePath = Base::suffix($this->settings['path'], '/') . $name; } else { $filePath = $name; } $file = $this->path($filePath, $type); if( ! is_file($file) ) { if( file_put_contents($file, $controller) ) { return true; } } } return false; // @codeCoverageIgnore } /** * Protected Functions * * @param string & $controller * @param string $namespace = NULL */ protected function alias(string & $controller, ?string $namespace = NULL) { if( ! empty($this->settings['alias']) ) { $controller .= EOL.EOL.'class_alias("'.Base::suffix($namespace, '\\').$name.'", "'.$this->settings['alias'].'");'; // @codeCoverageIgnore } } /** * Protected Functions * * @param string & $controller */ protected function functions(string & $controller) { $parameters = ''; $functions = (array) ($this->settings['functions'] ?? []); if( ! empty($functions) ) foreach( $functions as $isKey => $function ) { if( ! empty($function) ) { if( ! is_numeric($isKey) ) { if( is_array($function) ) { foreach( $function as $key => $val ) { $subvalue = ''; if( ! is_numeric($key) ) { $subvalue = $val; $val = $key; } $vartype = ''; if( strstr($val, ' ') ) { $varEx = explode(' ', $val); $val = $varEx[1]; $vartype = $varEx[0] . ' '; } if( strpos($val, '...') === 0 ) { $varprefix = str_replace('...', '...$', $val ?? ''); $subvalue = ''; } else { $varprefix = '$'.$val; } $parameters .= $vartype . $varprefix.( ! empty($subvalue) ? ' = '.$subvalue : '').', '; } $parameters = rtrim($parameters, ', '); } $function = $isKey; } $function = $this->vartype($function); $controller .= HT.$function->priority." function {$function->var}({$parameters})".EOL; $controller .= HT."{".EOL; $controller .= HT.HT."// Your codes...".EOL; $controller .= HT."}".EOL.EOL; } } } /** * Protected Uses * * @param string & $controller * @param string & $namespace = NULL */ protected function namespace(string & $controller, string & $namespace = NULL) { if( ! empty($this->settings['namespace']) ) { $namespace = $this->settings['namespace']; $controller .= "namespace ".$namespace.";".EOL.EOL; } } /** * Protected Uses * * @param string & $controller */ protected function uses(string & $controller) { if( ! empty($this->settings['use']) ) { foreach( $this->settings['use'] as $key => $use ) { if( is_numeric($key) ) { $controller .= "use {$use};".EOL; } else { $controller .= "use {$key} as {$use};".EOL; } } $controller .= EOL; } } /** * Protected Extends * * @param string & $controller */ protected function extends(string & $controller) { if( ! empty($this->settings['extends']) ) { $controller .= " extends ".$this->settings['extends']; } } /** * Protected Implements * * @param string & $controller */ protected function implements(string & $controller) { if( ! empty($this->settings['implements']) ) { $controller .= " implements ".( is_array($this->settings['implements']) ? implode(', ', $this->settings['implements']) // @codeCoverageIgnore : $this->settings['implements'] ); } } /** * Protected Traits * * @param string & $controller */ protected function traits(string & $controller) { if( ! empty($this->settings['traits']) ) { if( is_array($this->settings['traits']) ) foreach( $this->settings['traits'] as $trait ) { $controller .= HT."use {$trait};".EOL; } else { $controller .= HT."use ".$this->settings['traits'].";".EOL; // @codeCoverageIgnore } $controller .= EOL; } } /** * Protected Contants * * @param string & $controller */ protected function constants(string & $controller) { if( ! empty($this->settings['constants']) ) { foreach( $this->settings['constants'] as $key => $val ) { $controller .= HT."const {$key} = {$val};".EOL; } $controller .= EOL; } } /** * Protected Vars * * @param string & $controller */ protected function vars(string & $controller) { if( ! empty($this->settings['vars']) ) { $var = ''; foreach( $this->settings['vars'] as $isKey => $var ) { if( ! is_numeric($isKey) ) { $value = $var; $var = $isKey; } $vars = $this->vartype($var); $controller .= HT.$vars->priority.' $'.$vars->var.( ! empty($value) ? " = ".$value : '' ).";".EOL; } $controller .= EOL; } } /** * Protected Variable Type */ protected function vartype($variable) { $this->getEncapsulationType($variable, $priority, $static); return (object) [ 'priority' => $priority . $static, 'var' => $variable ]; } /** * Protected get encapsulation type */ protected function getEncapsulationType(&$variable, &$priority, &$static) { $static = NULL; if( preg_match('/^((?public|protected|private)(?\sstatic)*\:)/', $variable ?? '', $match) ) { $priority = $match['type']; $static = $match['access'] ?? $static; $variable = str_ireplace($match[1], '', $variable ?? ''); } else { $priority = 'public'; } } /** * Protected type */ protected function type($type) { switch( $type ) { case 'model' : $return = MODELS_DIR; break; case 'controller': $return = CONTROLLERS_DIR; break; case 'library' : $return = LIBRARIES_DIR; break; case 'command' : $return = COMMANDS_DIR; break; } $path = PROJECT_TYPE === 'EIP' ? Datatype::divide(rtrim($return ?? '', '/'), '/', -1) : $return; return Base::suffix($path); } }