@@ -2,14 +2,14 @@ |
||
| 2 | 2 | |
| 3 | 3 | abstract class Controller |
| 4 | 4 | { |
| 5 | - protected $viewPath; |
|
| 5 | + protected $viewPath; |
|
| 6 | 6 | |
| 7 | - protected function view() |
|
| 8 | - { |
|
| 9 | - } |
|
| 7 | + protected function view() |
|
| 8 | + { |
|
| 9 | + } |
|
| 10 | 10 | |
| 11 | - protected function template($template) |
|
| 12 | - { |
|
| 13 | - template($this->viewPath.$template); |
|
| 14 | - } |
|
| 11 | + protected function template($template) |
|
| 12 | + { |
|
| 13 | + template($this->viewPath.$template); |
|
| 14 | + } |
|
| 15 | 15 | } |
@@ -2,35 +2,35 @@ |
||
| 2 | 2 | |
| 3 | 3 | abstract class Model extends Cortex |
| 4 | 4 | { |
| 5 | - protected $app; |
|
| 6 | - protected $db = 'DB'; |
|
| 7 | - protected $fieldConf = array( |
|
| 8 | - 'created_at' => array( |
|
| 9 | - 'type' => Schema::DT_TIMESTAMP, |
|
| 10 | - 'default' => Schema::DF_CURRENT_TIMESTAMP |
|
| 11 | - ), |
|
| 12 | - 'updated_at' => array( |
|
| 13 | - 'type' => Schema::DT_TIMESTAMP, |
|
| 14 | - 'default' => '0-0-0 0:0:0' |
|
| 15 | - ), |
|
| 16 | - 'deleted_at' => array( |
|
| 17 | - 'type' => Schema::DT_TIMESTAMP, |
|
| 18 | - 'default' => '0-0-0 0:0:0' |
|
| 19 | - ) |
|
| 20 | - ); |
|
| 5 | + protected $app; |
|
| 6 | + protected $db = 'DB'; |
|
| 7 | + protected $fieldConf = array( |
|
| 8 | + 'created_at' => array( |
|
| 9 | + 'type' => Schema::DT_TIMESTAMP, |
|
| 10 | + 'default' => Schema::DF_CURRENT_TIMESTAMP |
|
| 11 | + ), |
|
| 12 | + 'updated_at' => array( |
|
| 13 | + 'type' => Schema::DT_TIMESTAMP, |
|
| 14 | + 'default' => '0-0-0 0:0:0' |
|
| 15 | + ), |
|
| 16 | + 'deleted_at' => array( |
|
| 17 | + 'type' => Schema::DT_TIMESTAMP, |
|
| 18 | + 'default' => '0-0-0 0:0:0' |
|
| 19 | + ) |
|
| 20 | + ); |
|
| 21 | 21 | |
| 22 | - public function __construct() |
|
| 23 | - { |
|
| 24 | - if (property_exists($this, 'fields')) { |
|
| 25 | - $this->fieldConf = array_merge($this->fields, $this->fieldConf); |
|
| 26 | - } |
|
| 22 | + public function __construct() |
|
| 23 | + { |
|
| 24 | + if (property_exists($this, 'fields')) { |
|
| 25 | + $this->fieldConf = array_merge($this->fields, $this->fieldConf); |
|
| 26 | + } |
|
| 27 | 27 | |
| 28 | - parent::__construct(); |
|
| 29 | - $this->app = f3(); |
|
| 30 | - //$this->beforesave($this->validate(get_called_class())); |
|
| 31 | - } |
|
| 28 | + parent::__construct(); |
|
| 29 | + $this->app = f3(); |
|
| 30 | + //$this->beforesave($this->validate(get_called_class())); |
|
| 31 | + } |
|
| 32 | 32 | |
| 33 | - /*private function validate($caller, $parent) { |
|
| 33 | + /*private function validate($caller, $parent) { |
|
| 34 | 34 | $valid = true; |
| 35 | 35 | foreach($this->getFieldConfiguration() as $field => $conf) { |
| 36 | 36 | if(isset($conf['type']) && !isset($conf['relType'])){ |
@@ -2,88 +2,88 @@ |
||
| 2 | 2 | |
| 3 | 3 | class Route extends Prefab |
| 4 | 4 | { |
| 5 | - private $app; |
|
| 6 | - |
|
| 7 | - public function __construct() |
|
| 8 | - { |
|
| 9 | - if ($this->app == null) { |
|
| 10 | - $this->app = f3(); |
|
| 11 | - } |
|
| 12 | - } |
|
| 13 | - |
|
| 14 | - public function uri() |
|
| 15 | - { |
|
| 16 | - return $this->app['URI']; |
|
| 17 | - } |
|
| 18 | - |
|
| 19 | - public function type() |
|
| 20 | - { |
|
| 21 | - return $this->app['VERB']; |
|
| 22 | - } |
|
| 23 | - |
|
| 24 | - public function has($route) |
|
| 25 | - { |
|
| 26 | - if (str_contains($route, '/')) { |
|
| 27 | - return array_key_exists($route, $this->getRoutes()); |
|
| 28 | - } |
|
| 29 | - |
|
| 30 | - return $this->getNamedRoute($route); |
|
| 31 | - } |
|
| 32 | - |
|
| 33 | - public function current() |
|
| 34 | - { |
|
| 35 | - return $this->app['PATH']; |
|
| 36 | - } |
|
| 37 | - |
|
| 38 | - public function is($route) |
|
| 39 | - { |
|
| 40 | - return Str::contains($this->current(), $route); |
|
| 41 | - } |
|
| 42 | - |
|
| 43 | - public function currentRouteName() |
|
| 44 | - { |
|
| 45 | - return $this->getRoutes()[$this->current()][0][$this->type()][3]; |
|
| 46 | - } |
|
| 47 | - |
|
| 48 | - public function getRouteName($route) |
|
| 49 | - { |
|
| 50 | - $response = null; |
|
| 51 | - foreach ($this->getNamedRoutes() as $name => $url) { |
|
| 52 | - if ($url == $route) { |
|
| 53 | - $response[] = $name; |
|
| 54 | - } |
|
| 55 | - } |
|
| 56 | - return $response; |
|
| 57 | - //return array_search($this->getNamedRoutes(), $route); |
|
| 58 | - } |
|
| 59 | - |
|
| 60 | - public function getNamedRoute($route) |
|
| 61 | - { |
|
| 62 | - return array_key_exists($route, $this->getNamedRoutes()); |
|
| 63 | - } |
|
| 64 | - |
|
| 65 | - public function getNamedRoutes() |
|
| 66 | - { |
|
| 67 | - return $this->app['ALIASES']; |
|
| 68 | - } |
|
| 69 | - |
|
| 70 | - public function getRoutes() |
|
| 71 | - { |
|
| 72 | - return $this->app['ROUTES']; |
|
| 73 | - } |
|
| 74 | - |
|
| 75 | - public function hasParameter($parameter) |
|
| 76 | - { |
|
| 77 | - return (bool) $this->parameter($parameter); |
|
| 78 | - } |
|
| 79 | - |
|
| 80 | - public function parameters() |
|
| 81 | - { |
|
| 82 | - return $this->app[$this->type()]; |
|
| 83 | - } |
|
| 84 | - |
|
| 85 | - public function parameter($parameter) |
|
| 86 | - { |
|
| 87 | - return $this->app[$this->type().'.'.$parameter]; |
|
| 88 | - } |
|
| 5 | + private $app; |
|
| 6 | + |
|
| 7 | + public function __construct() |
|
| 8 | + { |
|
| 9 | + if ($this->app == null) { |
|
| 10 | + $this->app = f3(); |
|
| 11 | + } |
|
| 12 | + } |
|
| 13 | + |
|
| 14 | + public function uri() |
|
| 15 | + { |
|
| 16 | + return $this->app['URI']; |
|
| 17 | + } |
|
| 18 | + |
|
| 19 | + public function type() |
|
| 20 | + { |
|
| 21 | + return $this->app['VERB']; |
|
| 22 | + } |
|
| 23 | + |
|
| 24 | + public function has($route) |
|
| 25 | + { |
|
| 26 | + if (str_contains($route, '/')) { |
|
| 27 | + return array_key_exists($route, $this->getRoutes()); |
|
| 28 | + } |
|
| 29 | + |
|
| 30 | + return $this->getNamedRoute($route); |
|
| 31 | + } |
|
| 32 | + |
|
| 33 | + public function current() |
|
| 34 | + { |
|
| 35 | + return $this->app['PATH']; |
|
| 36 | + } |
|
| 37 | + |
|
| 38 | + public function is($route) |
|
| 39 | + { |
|
| 40 | + return Str::contains($this->current(), $route); |
|
| 41 | + } |
|
| 42 | + |
|
| 43 | + public function currentRouteName() |
|
| 44 | + { |
|
| 45 | + return $this->getRoutes()[$this->current()][0][$this->type()][3]; |
|
| 46 | + } |
|
| 47 | + |
|
| 48 | + public function getRouteName($route) |
|
| 49 | + { |
|
| 50 | + $response = null; |
|
| 51 | + foreach ($this->getNamedRoutes() as $name => $url) { |
|
| 52 | + if ($url == $route) { |
|
| 53 | + $response[] = $name; |
|
| 54 | + } |
|
| 55 | + } |
|
| 56 | + return $response; |
|
| 57 | + //return array_search($this->getNamedRoutes(), $route); |
|
| 58 | + } |
|
| 59 | + |
|
| 60 | + public function getNamedRoute($route) |
|
| 61 | + { |
|
| 62 | + return array_key_exists($route, $this->getNamedRoutes()); |
|
| 63 | + } |
|
| 64 | + |
|
| 65 | + public function getNamedRoutes() |
|
| 66 | + { |
|
| 67 | + return $this->app['ALIASES']; |
|
| 68 | + } |
|
| 69 | + |
|
| 70 | + public function getRoutes() |
|
| 71 | + { |
|
| 72 | + return $this->app['ROUTES']; |
|
| 73 | + } |
|
| 74 | + |
|
| 75 | + public function hasParameter($parameter) |
|
| 76 | + { |
|
| 77 | + return (bool) $this->parameter($parameter); |
|
| 78 | + } |
|
| 79 | + |
|
| 80 | + public function parameters() |
|
| 81 | + { |
|
| 82 | + return $this->app[$this->type()]; |
|
| 83 | + } |
|
| 84 | + |
|
| 85 | + public function parameter($parameter) |
|
| 86 | + { |
|
| 87 | + return $this->app[$this->type().'.'.$parameter]; |
|
| 88 | + } |
|
| 89 | 89 | } |
@@ -2,123 +2,123 @@ |
||
| 2 | 2 | |
| 3 | 3 | class Captcha extends Prefab |
| 4 | 4 | { |
| 5 | - protected $name; |
|
| 6 | - protected $code; |
|
| 7 | - protected $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
|
| 8 | - |
|
| 9 | - public function __construct($name = 'captcha-string') |
|
| 10 | - { |
|
| 11 | - $this->name = $name; |
|
| 12 | - } |
|
| 13 | - |
|
| 14 | - public function text($length = 4, $mock = null) |
|
| 15 | - { |
|
| 16 | - $this->setSession($code = $this->_generate($length)); |
|
| 17 | - return $code; |
|
| 18 | - } |
|
| 19 | - |
|
| 20 | - public function img($length = 4, $class = 'captcha-img') |
|
| 21 | - { |
|
| 22 | - return '<img src="'.$this->text($length).'" class="'.$class.'" />'; |
|
| 23 | - } |
|
| 24 | - |
|
| 25 | - public function source($length = 4, $mock = null) |
|
| 26 | - { |
|
| 27 | - } |
|
| 28 | - |
|
| 29 | - public function input($class = 'captcha-input') |
|
| 30 | - { |
|
| 31 | - return '<input type="text" class="'.$class.'" name="'.$this->name.'" />'; |
|
| 32 | - } |
|
| 33 | - |
|
| 34 | - /* |
|
| 5 | + protected $name; |
|
| 6 | + protected $code; |
|
| 7 | + protected $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
|
| 8 | + |
|
| 9 | + public function __construct($name = 'captcha-string') |
|
| 10 | + { |
|
| 11 | + $this->name = $name; |
|
| 12 | + } |
|
| 13 | + |
|
| 14 | + public function text($length = 4, $mock = null) |
|
| 15 | + { |
|
| 16 | + $this->setSession($code = $this->_generate($length)); |
|
| 17 | + return $code; |
|
| 18 | + } |
|
| 19 | + |
|
| 20 | + public function img($length = 4, $class = 'captcha-img') |
|
| 21 | + { |
|
| 22 | + return '<img src="'.$this->text($length).'" class="'.$class.'" />'; |
|
| 23 | + } |
|
| 24 | + |
|
| 25 | + public function source($length = 4, $mock = null) |
|
| 26 | + { |
|
| 27 | + } |
|
| 28 | + |
|
| 29 | + public function input($class = 'captcha-input') |
|
| 30 | + { |
|
| 31 | + return '<input type="text" class="'.$class.'" name="'.$this->name.'" />'; |
|
| 32 | + } |
|
| 33 | + |
|
| 34 | + /* |
|
| 35 | 35 | * Captcha::instance()->render(4) |
| 36 | 36 | * Captcha::instance()->render(array('type'=>'img','length'=>4,'class'=>array('img'=>'captcha-img','input'=>'captcha-input'))); |
| 37 | 37 | */ |
| 38 | - public function render($param, $url) |
|
| 39 | - { |
|
| 40 | - if (is_array($param)) { |
|
| 41 | - $func = null; |
|
| 42 | - $length = null; |
|
| 43 | - $imgClass = null; |
|
| 44 | - $inputClass = null; |
|
| 45 | - foreach ($param as $key => $val) { |
|
| 46 | - if ('type' == $key) { |
|
| 47 | - $func = $key; |
|
| 48 | - } |
|
| 49 | - if ('length' == $key) { |
|
| 50 | - $length = $key; |
|
| 51 | - } |
|
| 52 | - if ('class' == $key && is_array($key)) { |
|
| 53 | - if (array_key_exists('img', $key)) { |
|
| 54 | - $imgClass = $key['img']; |
|
| 55 | - } elseif (array_key_exists('input', $key)) { |
|
| 56 | - $inputClass = $key['input']; |
|
| 57 | - } |
|
| 58 | - } else { |
|
| 59 | - $imgClass = $inputClass = $key; |
|
| 60 | - } |
|
| 61 | - } |
|
| 62 | - if (method_exists($this, $func)) { |
|
| 63 | - $response = $this->$key($length, $imgClass).$this->input($inputClass); |
|
| 64 | - } else { |
|
| 65 | - throw new Exception("Error Processing Captcha Method", 1); |
|
| 66 | - } |
|
| 67 | - } elseif (is_numeric($param)) { |
|
| 68 | - $response = $this->img($param).$this->input(); |
|
| 69 | - } else { |
|
| 70 | - throw new Exception("Error Processing Captcha Parameters", 1); |
|
| 71 | - } |
|
| 72 | - |
|
| 73 | - return '<form method="post" action="'.$url.'">'.$response.'</form>'; |
|
| 74 | - } |
|
| 75 | - |
|
| 76 | - public function name($name) |
|
| 77 | - { |
|
| 78 | - $this->name = $name; |
|
| 79 | - return $this; |
|
| 80 | - } |
|
| 81 | - |
|
| 82 | - public function verify($code) |
|
| 83 | - { |
|
| 84 | - $this->startSession(); |
|
| 85 | - |
|
| 86 | - $n = $this->name; |
|
| 87 | - |
|
| 88 | - $valid = isset($_SESSION[$n]) |
|
| 89 | - && isset($_POST[$n]) |
|
| 90 | - && strlen($_POST[$n]) |
|
| 91 | - && ($_SESSION[$n] === crypt(strtolower($_POST[$n]), $this->salt())); |
|
| 92 | - |
|
| 93 | - if (isset($_POST[$n])) { |
|
| 94 | - unset($_POST[$n]); |
|
| 95 | - } |
|
| 96 | - |
|
| 97 | - if ($valid && isset($_SESSION[$n])) { |
|
| 98 | - unset($_SESSION[$n]); |
|
| 99 | - } |
|
| 100 | - |
|
| 101 | - return $valid; |
|
| 102 | - } |
|
| 103 | - |
|
| 104 | - private function startSession() |
|
| 105 | - { |
|
| 106 | - session_id() || session_start(); |
|
| 107 | - } |
|
| 108 | - |
|
| 109 | - private function setSession($string) |
|
| 110 | - { |
|
| 111 | - $this->startSession(); |
|
| 112 | - $_SESSION[$this->name] = crypt(strtolower($string), $this->salt()); |
|
| 113 | - } |
|
| 114 | - |
|
| 115 | - private function _generate($length) |
|
| 116 | - { |
|
| 117 | - return $this->code = substr(str_shuffle(str_repeat($this->pool, 5)), 0, $length); |
|
| 118 | - } |
|
| 119 | - |
|
| 120 | - private static function salt() |
|
| 121 | - { |
|
| 122 | - return md5(__FILE__.filemtime(__FILE__)); |
|
| 123 | - } |
|
| 38 | + public function render($param, $url) |
|
| 39 | + { |
|
| 40 | + if (is_array($param)) { |
|
| 41 | + $func = null; |
|
| 42 | + $length = null; |
|
| 43 | + $imgClass = null; |
|
| 44 | + $inputClass = null; |
|
| 45 | + foreach ($param as $key => $val) { |
|
| 46 | + if ('type' == $key) { |
|
| 47 | + $func = $key; |
|
| 48 | + } |
|
| 49 | + if ('length' == $key) { |
|
| 50 | + $length = $key; |
|
| 51 | + } |
|
| 52 | + if ('class' == $key && is_array($key)) { |
|
| 53 | + if (array_key_exists('img', $key)) { |
|
| 54 | + $imgClass = $key['img']; |
|
| 55 | + } elseif (array_key_exists('input', $key)) { |
|
| 56 | + $inputClass = $key['input']; |
|
| 57 | + } |
|
| 58 | + } else { |
|
| 59 | + $imgClass = $inputClass = $key; |
|
| 60 | + } |
|
| 61 | + } |
|
| 62 | + if (method_exists($this, $func)) { |
|
| 63 | + $response = $this->$key($length, $imgClass).$this->input($inputClass); |
|
| 64 | + } else { |
|
| 65 | + throw new Exception("Error Processing Captcha Method", 1); |
|
| 66 | + } |
|
| 67 | + } elseif (is_numeric($param)) { |
|
| 68 | + $response = $this->img($param).$this->input(); |
|
| 69 | + } else { |
|
| 70 | + throw new Exception("Error Processing Captcha Parameters", 1); |
|
| 71 | + } |
|
| 72 | + |
|
| 73 | + return '<form method="post" action="'.$url.'">'.$response.'</form>'; |
|
| 74 | + } |
|
| 75 | + |
|
| 76 | + public function name($name) |
|
| 77 | + { |
|
| 78 | + $this->name = $name; |
|
| 79 | + return $this; |
|
| 80 | + } |
|
| 81 | + |
|
| 82 | + public function verify($code) |
|
| 83 | + { |
|
| 84 | + $this->startSession(); |
|
| 85 | + |
|
| 86 | + $n = $this->name; |
|
| 87 | + |
|
| 88 | + $valid = isset($_SESSION[$n]) |
|
| 89 | + && isset($_POST[$n]) |
|
| 90 | + && strlen($_POST[$n]) |
|
| 91 | + && ($_SESSION[$n] === crypt(strtolower($_POST[$n]), $this->salt())); |
|
| 92 | + |
|
| 93 | + if (isset($_POST[$n])) { |
|
| 94 | + unset($_POST[$n]); |
|
| 95 | + } |
|
| 96 | + |
|
| 97 | + if ($valid && isset($_SESSION[$n])) { |
|
| 98 | + unset($_SESSION[$n]); |
|
| 99 | + } |
|
| 100 | + |
|
| 101 | + return $valid; |
|
| 102 | + } |
|
| 103 | + |
|
| 104 | + private function startSession() |
|
| 105 | + { |
|
| 106 | + session_id() || session_start(); |
|
| 107 | + } |
|
| 108 | + |
|
| 109 | + private function setSession($string) |
|
| 110 | + { |
|
| 111 | + $this->startSession(); |
|
| 112 | + $_SESSION[$this->name] = crypt(strtolower($string), $this->salt()); |
|
| 113 | + } |
|
| 114 | + |
|
| 115 | + private function _generate($length) |
|
| 116 | + { |
|
| 117 | + return $this->code = substr(str_shuffle(str_repeat($this->pool, 5)), 0, $length); |
|
| 118 | + } |
|
| 119 | + |
|
| 120 | + private static function salt() |
|
| 121 | + { |
|
| 122 | + return md5(__FILE__.filemtime(__FILE__)); |
|
| 123 | + } |
|
| 124 | 124 | } |
@@ -55,18 +55,18 @@ |
||
| 55 | 55 | } elseif (array_key_exists('input', $key)) { |
| 56 | 56 | $inputClass = $key['input']; |
| 57 | 57 | } |
| 58 | - } else { |
|
| 58 | + }else { |
|
| 59 | 59 | $imgClass = $inputClass = $key; |
| 60 | 60 | } |
| 61 | 61 | } |
| 62 | 62 | if (method_exists($this, $func)) { |
| 63 | 63 | $response = $this->$key($length, $imgClass).$this->input($inputClass); |
| 64 | - } else { |
|
| 64 | + }else { |
|
| 65 | 65 | throw new Exception("Error Processing Captcha Method", 1); |
| 66 | 66 | } |
| 67 | 67 | } elseif (is_numeric($param)) { |
| 68 | 68 | $response = $this->img($param).$this->input(); |
| 69 | - } else { |
|
| 69 | + }else { |
|
| 70 | 70 | throw new Exception("Error Processing Captcha Parameters", 1); |
| 71 | 71 | } |
| 72 | 72 | |
@@ -1,90 +1,90 @@ |
||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | 3 | return [ |
| 4 | - 'site' => [ |
|
| 5 | - 'title' => 'F3!', |
|
| 6 | - 'description' => 'description...', |
|
| 7 | - 'keywords' => 'f3, fatfree, fatfreeframework, anutig3r', |
|
| 8 | - 'author' => [ |
|
| 9 | - 'name' => 'Anu Tig3r', |
|
| 10 | - 'email' => '[email protected]' |
|
| 11 | - ] |
|
| 12 | - ], |
|
| 4 | + 'site' => [ |
|
| 5 | + 'title' => 'F3!', |
|
| 6 | + 'description' => 'description...', |
|
| 7 | + 'keywords' => 'f3, fatfree, fatfreeframework, anutig3r', |
|
| 8 | + 'author' => [ |
|
| 9 | + 'name' => 'Anu Tig3r', |
|
| 10 | + 'email' => '[email protected]' |
|
| 11 | + ] |
|
| 12 | + ], |
|
| 13 | 13 | |
| 14 | - 'error' => [ |
|
| 15 | - 'validations' => [ |
|
| 16 | - 'accepted' => 'The {0} must be accepted.', |
|
| 17 | - 'active_url' => 'The {0} is not a valid URL.', |
|
| 18 | - 'after' => 'The {0} must be a date after {1}.', |
|
| 19 | - 'after_or_equal' => 'The {0} must be a date after or equal to {1}.', |
|
| 20 | - 'alpha' => 'The {0} may only contain letters.', |
|
| 21 | - 'alpha_dash' => 'The {0} may only contain letters, numbers, and dashes.', |
|
| 22 | - 'alpha_num' => 'The {0} may only contain letters and numbers.', |
|
| 23 | - 'array' => 'The {0} must be an array.', |
|
| 24 | - 'before' => 'The {0} must be a date before {1}.', |
|
| 25 | - 'before_or_equal' => 'The {0} must be a date before or equal to {1}.', |
|
| 26 | - 'between' => [ |
|
| 27 | - 'numeric' => 'The {0} must be between {1} and {2}.', |
|
| 28 | - 'file' => 'The {0} must be between {1} and {2} kilobytes.', |
|
| 29 | - 'string' => 'The {0} must be between {1} and {2} characters.', |
|
| 30 | - 'array' => 'The {0} must have between {1} and {2} items.', |
|
| 31 | - ], |
|
| 32 | - 'boolean' => 'The {0} field must be true or false.', |
|
| 33 | - 'confirmed' => 'The {0} confirmation does not match.', |
|
| 34 | - 'date' => 'The {0} is not a valid date.', |
|
| 35 | - 'date_format' => 'The {0} does not match the format {1}.', |
|
| 36 | - 'digits' => 'The {0} must be :digits digits.', |
|
| 37 | - 'digits_between' => 'The {0} must be between {1} and {1} digits.', |
|
| 38 | - 'email' => 'The {0} must be a valid email address.', |
|
| 39 | - 'exists' => 'The selected {0} is invalid.', |
|
| 40 | - 'file' => 'The {0} must be a file.', |
|
| 41 | - 'filled' => 'The {0} field must have a value.', |
|
| 42 | - 'image' => 'The {0} must be an image.', |
|
| 43 | - 'in' => 'The selected {0} is invalid.', |
|
| 44 | - 'in_array' => 'The {0} field does not exist in {1}.', |
|
| 45 | - 'integer' => 'The {0} must be an integer.', |
|
| 46 | - 'ip' => 'The {0} must be a valid IP address.', |
|
| 47 | - 'ipv4' => 'The {0} must be a valid IPv4 address.', |
|
| 48 | - 'ipv6' => 'The {0} must be a valid IPv6 address.', |
|
| 49 | - 'json' => 'The {0} must be a valid JSON string.', |
|
| 50 | - 'max' => [ |
|
| 51 | - 'numeric' => 'The {0} may not be greater than {1}.', |
|
| 52 | - 'file' => 'The {0} may not be greater than {1} kilobytes.', |
|
| 53 | - 'string' => 'The {0} may not be greater than {1} characters.', |
|
| 54 | - 'array' => 'The {0} may not have more than {1} items.', |
|
| 55 | - ], |
|
| 56 | - 'mimes' => 'The {0} must be a file of {1} {2}.', |
|
| 57 | - 'mimetypes' => 'The {0} must be a file of {1} {2}.', |
|
| 58 | - 'min' => [ |
|
| 59 | - 'numeric' => 'The {0} must be at least {1}.', |
|
| 60 | - 'file' => 'The {0} must be at least {1} kilobytes.', |
|
| 61 | - 'string' => 'The {0} must be at least {1} characters.', |
|
| 62 | - 'array' => 'The {0} must have at least {1} items.', |
|
| 63 | - ], |
|
| 64 | - 'not_in' => 'The selected {0} is invalid.', |
|
| 65 | - 'numeric' => 'The {0} must be a number.', |
|
| 66 | - 'regex' => 'The {0} format is invalid.', |
|
| 67 | - 'required' => 'The {0} field is required.', |
|
| 68 | - 'same' => 'The {0} and {1} must match.', |
|
| 69 | - 'size' => [ |
|
| 70 | - 'numeric' => 'The {0} must be {1}.', |
|
| 71 | - 'file' => 'The {0} must be {1} kilobytes.', |
|
| 72 | - 'string' => 'The {0} must be {1} characters.', |
|
| 73 | - 'array' => 'The {0} must contain {1} items.', |
|
| 74 | - ], |
|
| 75 | - 'string' => 'The {0} must be a string.', |
|
| 76 | - 'timezone' => 'The {0} must be a valid zone.', |
|
| 77 | - 'unique' => 'The {0} has already been taken.', |
|
| 78 | - 'uploaded' => 'The {0} failed to upload.', |
|
| 79 | - 'url' => 'The {0} format is invalid.', |
|
| 80 | - ], |
|
| 81 | - 'auth' => [ |
|
| 82 | - 'not_registered' => '{0} is not registered with us!', |
|
| 83 | - 'password' => 'Password is not geniune for {0}', |
|
| 84 | - ] |
|
| 85 | - ], |
|
| 14 | + 'error' => [ |
|
| 15 | + 'validations' => [ |
|
| 16 | + 'accepted' => 'The {0} must be accepted.', |
|
| 17 | + 'active_url' => 'The {0} is not a valid URL.', |
|
| 18 | + 'after' => 'The {0} must be a date after {1}.', |
|
| 19 | + 'after_or_equal' => 'The {0} must be a date after or equal to {1}.', |
|
| 20 | + 'alpha' => 'The {0} may only contain letters.', |
|
| 21 | + 'alpha_dash' => 'The {0} may only contain letters, numbers, and dashes.', |
|
| 22 | + 'alpha_num' => 'The {0} may only contain letters and numbers.', |
|
| 23 | + 'array' => 'The {0} must be an array.', |
|
| 24 | + 'before' => 'The {0} must be a date before {1}.', |
|
| 25 | + 'before_or_equal' => 'The {0} must be a date before or equal to {1}.', |
|
| 26 | + 'between' => [ |
|
| 27 | + 'numeric' => 'The {0} must be between {1} and {2}.', |
|
| 28 | + 'file' => 'The {0} must be between {1} and {2} kilobytes.', |
|
| 29 | + 'string' => 'The {0} must be between {1} and {2} characters.', |
|
| 30 | + 'array' => 'The {0} must have between {1} and {2} items.', |
|
| 31 | + ], |
|
| 32 | + 'boolean' => 'The {0} field must be true or false.', |
|
| 33 | + 'confirmed' => 'The {0} confirmation does not match.', |
|
| 34 | + 'date' => 'The {0} is not a valid date.', |
|
| 35 | + 'date_format' => 'The {0} does not match the format {1}.', |
|
| 36 | + 'digits' => 'The {0} must be :digits digits.', |
|
| 37 | + 'digits_between' => 'The {0} must be between {1} and {1} digits.', |
|
| 38 | + 'email' => 'The {0} must be a valid email address.', |
|
| 39 | + 'exists' => 'The selected {0} is invalid.', |
|
| 40 | + 'file' => 'The {0} must be a file.', |
|
| 41 | + 'filled' => 'The {0} field must have a value.', |
|
| 42 | + 'image' => 'The {0} must be an image.', |
|
| 43 | + 'in' => 'The selected {0} is invalid.', |
|
| 44 | + 'in_array' => 'The {0} field does not exist in {1}.', |
|
| 45 | + 'integer' => 'The {0} must be an integer.', |
|
| 46 | + 'ip' => 'The {0} must be a valid IP address.', |
|
| 47 | + 'ipv4' => 'The {0} must be a valid IPv4 address.', |
|
| 48 | + 'ipv6' => 'The {0} must be a valid IPv6 address.', |
|
| 49 | + 'json' => 'The {0} must be a valid JSON string.', |
|
| 50 | + 'max' => [ |
|
| 51 | + 'numeric' => 'The {0} may not be greater than {1}.', |
|
| 52 | + 'file' => 'The {0} may not be greater than {1} kilobytes.', |
|
| 53 | + 'string' => 'The {0} may not be greater than {1} characters.', |
|
| 54 | + 'array' => 'The {0} may not have more than {1} items.', |
|
| 55 | + ], |
|
| 56 | + 'mimes' => 'The {0} must be a file of {1} {2}.', |
|
| 57 | + 'mimetypes' => 'The {0} must be a file of {1} {2}.', |
|
| 58 | + 'min' => [ |
|
| 59 | + 'numeric' => 'The {0} must be at least {1}.', |
|
| 60 | + 'file' => 'The {0} must be at least {1} kilobytes.', |
|
| 61 | + 'string' => 'The {0} must be at least {1} characters.', |
|
| 62 | + 'array' => 'The {0} must have at least {1} items.', |
|
| 63 | + ], |
|
| 64 | + 'not_in' => 'The selected {0} is invalid.', |
|
| 65 | + 'numeric' => 'The {0} must be a number.', |
|
| 66 | + 'regex' => 'The {0} format is invalid.', |
|
| 67 | + 'required' => 'The {0} field is required.', |
|
| 68 | + 'same' => 'The {0} and {1} must match.', |
|
| 69 | + 'size' => [ |
|
| 70 | + 'numeric' => 'The {0} must be {1}.', |
|
| 71 | + 'file' => 'The {0} must be {1} kilobytes.', |
|
| 72 | + 'string' => 'The {0} must be {1} characters.', |
|
| 73 | + 'array' => 'The {0} must contain {1} items.', |
|
| 74 | + ], |
|
| 75 | + 'string' => 'The {0} must be a string.', |
|
| 76 | + 'timezone' => 'The {0} must be a valid zone.', |
|
| 77 | + 'unique' => 'The {0} has already been taken.', |
|
| 78 | + 'uploaded' => 'The {0} failed to upload.', |
|
| 79 | + 'url' => 'The {0} format is invalid.', |
|
| 80 | + ], |
|
| 81 | + 'auth' => [ |
|
| 82 | + 'not_registered' => '{0} is not registered with us!', |
|
| 83 | + 'password' => 'Password is not geniune for {0}', |
|
| 84 | + ] |
|
| 85 | + ], |
|
| 86 | 86 | |
| 87 | - 'messenger' => [ |
|
| 88 | - 'new' => '{0, plural, zero {No new message}, one {One new message}, other {You have # new messages}}' |
|
| 89 | - ] |
|
| 87 | + 'messenger' => [ |
|
| 88 | + 'new' => '{0, plural, zero {No new message}, one {One new message}, other {You have # new messages}}' |
|
| 89 | + ] |
|
| 90 | 90 | ]; |
@@ -2,171 +2,171 @@ |
||
| 2 | 2 | |
| 3 | 3 | class app extends Prefab |
| 4 | 4 | { |
| 5 | - public $db; |
|
| 6 | - public $app; |
|
| 7 | - public $session; |
|
| 8 | - public $authenticatedUser; |
|
| 9 | - |
|
| 10 | - public function __construct() |
|
| 11 | - { |
|
| 12 | - $this->app = $this->app ?: Base::instance(); |
|
| 13 | - } |
|
| 14 | - |
|
| 15 | - public static function singleton() |
|
| 16 | - { |
|
| 17 | - if (Registry::exists('APP')) { |
|
| 18 | - $app = Registry::get('APP'); |
|
| 19 | - } else { |
|
| 20 | - $app = new self; |
|
| 21 | - Registry::set('APP', $app); |
|
| 22 | - } |
|
| 23 | - return $app; |
|
| 24 | - } |
|
| 25 | - |
|
| 26 | - public function db() |
|
| 27 | - { |
|
| 28 | - return $this->db ?: $this->app->DB; |
|
| 29 | - } |
|
| 30 | - |
|
| 31 | - public function session() |
|
| 32 | - { |
|
| 33 | - return $this->session ?: $this->app->SESSION; |
|
| 34 | - } |
|
| 35 | - |
|
| 36 | - public function user() |
|
| 37 | - { |
|
| 38 | - return $this->authenticatedUser = $this->app->get('SESSION.USER') ?: false; |
|
| 39 | - } |
|
| 40 | - |
|
| 41 | - public function initialized($def = null) |
|
| 42 | - { |
|
| 43 | - return null !== $def ? $this->app->set('INITIALIZED', $def) : $this->app->get('INITIALIZED'); |
|
| 44 | - } |
|
| 45 | - |
|
| 46 | - public function config($key = null) |
|
| 47 | - { |
|
| 48 | - return $this->app->get($key ?: 'CONFIG'); |
|
| 49 | - } |
|
| 50 | - |
|
| 51 | - public function status() |
|
| 52 | - { |
|
| 53 | - return $this->app->IS_LIVE; |
|
| 54 | - } |
|
| 55 | - |
|
| 56 | - public function run() |
|
| 57 | - { |
|
| 58 | - $this->loadConfig(); |
|
| 59 | - $this->loadRoutes(); |
|
| 60 | - $this->checkForMaintenance(); |
|
| 61 | - $this->configureDebug(); |
|
| 62 | - $this->configureDB(); |
|
| 63 | - $this->configureSession(); |
|
| 64 | - $this->configureAssets(); |
|
| 65 | - $this->registerErrorHandler(); |
|
| 66 | - $this->initialized(true); |
|
| 67 | - $this->app->run(); |
|
| 68 | - } |
|
| 69 | - |
|
| 70 | - public function loadRoutes($file = null) |
|
| 71 | - { |
|
| 72 | - $this->_load('routes', $file); |
|
| 73 | - } |
|
| 74 | - |
|
| 75 | - public function loadConfig($file = null) |
|
| 76 | - { |
|
| 77 | - $this->_load('config', $file); |
|
| 78 | - } |
|
| 79 | - |
|
| 80 | - private function _load($path, $file = null) |
|
| 81 | - { |
|
| 82 | - if ($file) { |
|
| 83 | - $this->app->config(base_path("{path}/{$file}")); |
|
| 84 | - } else { |
|
| 85 | - foreach (glob(base_path("{$path}/*.ini")) as $file) { |
|
| 86 | - $this->app->config($file); |
|
| 87 | - } |
|
| 88 | - } |
|
| 89 | - } |
|
| 90 | - |
|
| 91 | - public function checkForMaintenance() |
|
| 92 | - { |
|
| 93 | - if (!$this->status()) { |
|
| 94 | - template('maintenance'); |
|
| 95 | - exit(); |
|
| 96 | - } |
|
| 97 | - } |
|
| 98 | - |
|
| 99 | - public function configureDebug() |
|
| 100 | - { |
|
| 101 | - if (!$this->app->DEV) { |
|
| 102 | - $this->app->set('DEBUG', 0); |
|
| 103 | - } |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - public function configureDB() |
|
| 107 | - { |
|
| 108 | - $type = strtolower($this->app->DB_TYPE); |
|
| 109 | - |
|
| 110 | - if ($type == 'jig') { |
|
| 111 | - $this->db = new DB\Jig($this->app->DB_PATH, DB\Jig::FORMAT_JSON); |
|
| 112 | - } elseif ($type == 'sql') { |
|
| 113 | - $this->db = new DB\SQL($this->app->DB, $this->app->DB_USER, $this->app->DB_PSWD); |
|
| 114 | - } elseif ($type == 'mongo') { |
|
| 115 | - $this->db = new DB\Mongo($this->app->DB, $this->app->DB_USER); |
|
| 116 | - } |
|
| 117 | - $this->app->set('DB', $this->db); |
|
| 118 | - } |
|
| 119 | - |
|
| 120 | - public function configureSession() |
|
| 121 | - { |
|
| 122 | - $type = strtolower($this->app->SESSION); |
|
| 123 | - |
|
| 124 | - if ($type) { |
|
| 125 | - if ($this->app->CSRF && ('jig' == $type || 'sql' == $type || 'mongo' == $type)) { |
|
| 126 | - $this->configureCSRF($type); |
|
| 127 | - } elseif ($this->app->CSRF) { |
|
| 128 | - $this->session = new Session(null, 'CSRF'); |
|
| 129 | - } else { |
|
| 130 | - if ($type == 'jig' || $type == 'mongo' || $type == 'sql') { |
|
| 131 | - $session = str_ireplace('/', '', 'DB\/'.$this->_getDBType($type).'\Session'); |
|
| 132 | - $this->session = new $session($this->app->DB); |
|
| 133 | - } else { |
|
| 134 | - $this->session = new Session(); |
|
| 135 | - } |
|
| 136 | - } |
|
| 137 | - $this->app->set('SESSION', $this->session); |
|
| 138 | - } |
|
| 139 | - } |
|
| 140 | - |
|
| 141 | - public function configureCSRF($type) |
|
| 142 | - { |
|
| 143 | - $session = str_ireplace('/', '', 'DB\/'.$this->_getDBType($type).'\Session'); |
|
| 144 | - $this->session = new $session($this->app->DB, 'sessions', null, 'CSRF'); |
|
| 145 | - } |
|
| 146 | - |
|
| 147 | - private function _getDBType($type) |
|
| 148 | - { |
|
| 149 | - if ($type == 'jig' || $type == 'mongo') { |
|
| 150 | - return ucfirst($type); |
|
| 151 | - } elseif ($type == 'sql') { |
|
| 152 | - return strtoupper($type); |
|
| 153 | - } |
|
| 154 | - } |
|
| 155 | - |
|
| 156 | - public function configureAssets() |
|
| 157 | - { |
|
| 158 | - $assets = Assets::instance(); |
|
| 159 | - $this->app->set('ASSETS.onFileNotFound', function ($file) { |
|
| 160 | - echo 'file not found: '.$file; |
|
| 161 | - }); |
|
| 162 | - } |
|
| 163 | - |
|
| 164 | - public function registerErrorHandler() |
|
| 165 | - { |
|
| 166 | - if ($this->app->DEV) { |
|
| 167 | - Falsum\Run::handler($this->app->DEBUG != 3); |
|
| 168 | - } else { |
|
| 169 | - $this->app->set('ONERROR', 'App\Core\Controllers\ErrorController->init'); |
|
| 170 | - } |
|
| 171 | - } |
|
| 5 | + public $db; |
|
| 6 | + public $app; |
|
| 7 | + public $session; |
|
| 8 | + public $authenticatedUser; |
|
| 9 | + |
|
| 10 | + public function __construct() |
|
| 11 | + { |
|
| 12 | + $this->app = $this->app ?: Base::instance(); |
|
| 13 | + } |
|
| 14 | + |
|
| 15 | + public static function singleton() |
|
| 16 | + { |
|
| 17 | + if (Registry::exists('APP')) { |
|
| 18 | + $app = Registry::get('APP'); |
|
| 19 | + } else { |
|
| 20 | + $app = new self; |
|
| 21 | + Registry::set('APP', $app); |
|
| 22 | + } |
|
| 23 | + return $app; |
|
| 24 | + } |
|
| 25 | + |
|
| 26 | + public function db() |
|
| 27 | + { |
|
| 28 | + return $this->db ?: $this->app->DB; |
|
| 29 | + } |
|
| 30 | + |
|
| 31 | + public function session() |
|
| 32 | + { |
|
| 33 | + return $this->session ?: $this->app->SESSION; |
|
| 34 | + } |
|
| 35 | + |
|
| 36 | + public function user() |
|
| 37 | + { |
|
| 38 | + return $this->authenticatedUser = $this->app->get('SESSION.USER') ?: false; |
|
| 39 | + } |
|
| 40 | + |
|
| 41 | + public function initialized($def = null) |
|
| 42 | + { |
|
| 43 | + return null !== $def ? $this->app->set('INITIALIZED', $def) : $this->app->get('INITIALIZED'); |
|
| 44 | + } |
|
| 45 | + |
|
| 46 | + public function config($key = null) |
|
| 47 | + { |
|
| 48 | + return $this->app->get($key ?: 'CONFIG'); |
|
| 49 | + } |
|
| 50 | + |
|
| 51 | + public function status() |
|
| 52 | + { |
|
| 53 | + return $this->app->IS_LIVE; |
|
| 54 | + } |
|
| 55 | + |
|
| 56 | + public function run() |
|
| 57 | + { |
|
| 58 | + $this->loadConfig(); |
|
| 59 | + $this->loadRoutes(); |
|
| 60 | + $this->checkForMaintenance(); |
|
| 61 | + $this->configureDebug(); |
|
| 62 | + $this->configureDB(); |
|
| 63 | + $this->configureSession(); |
|
| 64 | + $this->configureAssets(); |
|
| 65 | + $this->registerErrorHandler(); |
|
| 66 | + $this->initialized(true); |
|
| 67 | + $this->app->run(); |
|
| 68 | + } |
|
| 69 | + |
|
| 70 | + public function loadRoutes($file = null) |
|
| 71 | + { |
|
| 72 | + $this->_load('routes', $file); |
|
| 73 | + } |
|
| 74 | + |
|
| 75 | + public function loadConfig($file = null) |
|
| 76 | + { |
|
| 77 | + $this->_load('config', $file); |
|
| 78 | + } |
|
| 79 | + |
|
| 80 | + private function _load($path, $file = null) |
|
| 81 | + { |
|
| 82 | + if ($file) { |
|
| 83 | + $this->app->config(base_path("{path}/{$file}")); |
|
| 84 | + } else { |
|
| 85 | + foreach (glob(base_path("{$path}/*.ini")) as $file) { |
|
| 86 | + $this->app->config($file); |
|
| 87 | + } |
|
| 88 | + } |
|
| 89 | + } |
|
| 90 | + |
|
| 91 | + public function checkForMaintenance() |
|
| 92 | + { |
|
| 93 | + if (!$this->status()) { |
|
| 94 | + template('maintenance'); |
|
| 95 | + exit(); |
|
| 96 | + } |
|
| 97 | + } |
|
| 98 | + |
|
| 99 | + public function configureDebug() |
|
| 100 | + { |
|
| 101 | + if (!$this->app->DEV) { |
|
| 102 | + $this->app->set('DEBUG', 0); |
|
| 103 | + } |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + public function configureDB() |
|
| 107 | + { |
|
| 108 | + $type = strtolower($this->app->DB_TYPE); |
|
| 109 | + |
|
| 110 | + if ($type == 'jig') { |
|
| 111 | + $this->db = new DB\Jig($this->app->DB_PATH, DB\Jig::FORMAT_JSON); |
|
| 112 | + } elseif ($type == 'sql') { |
|
| 113 | + $this->db = new DB\SQL($this->app->DB, $this->app->DB_USER, $this->app->DB_PSWD); |
|
| 114 | + } elseif ($type == 'mongo') { |
|
| 115 | + $this->db = new DB\Mongo($this->app->DB, $this->app->DB_USER); |
|
| 116 | + } |
|
| 117 | + $this->app->set('DB', $this->db); |
|
| 118 | + } |
|
| 119 | + |
|
| 120 | + public function configureSession() |
|
| 121 | + { |
|
| 122 | + $type = strtolower($this->app->SESSION); |
|
| 123 | + |
|
| 124 | + if ($type) { |
|
| 125 | + if ($this->app->CSRF && ('jig' == $type || 'sql' == $type || 'mongo' == $type)) { |
|
| 126 | + $this->configureCSRF($type); |
|
| 127 | + } elseif ($this->app->CSRF) { |
|
| 128 | + $this->session = new Session(null, 'CSRF'); |
|
| 129 | + } else { |
|
| 130 | + if ($type == 'jig' || $type == 'mongo' || $type == 'sql') { |
|
| 131 | + $session = str_ireplace('/', '', 'DB\/'.$this->_getDBType($type).'\Session'); |
|
| 132 | + $this->session = new $session($this->app->DB); |
|
| 133 | + } else { |
|
| 134 | + $this->session = new Session(); |
|
| 135 | + } |
|
| 136 | + } |
|
| 137 | + $this->app->set('SESSION', $this->session); |
|
| 138 | + } |
|
| 139 | + } |
|
| 140 | + |
|
| 141 | + public function configureCSRF($type) |
|
| 142 | + { |
|
| 143 | + $session = str_ireplace('/', '', 'DB\/'.$this->_getDBType($type).'\Session'); |
|
| 144 | + $this->session = new $session($this->app->DB, 'sessions', null, 'CSRF'); |
|
| 145 | + } |
|
| 146 | + |
|
| 147 | + private function _getDBType($type) |
|
| 148 | + { |
|
| 149 | + if ($type == 'jig' || $type == 'mongo') { |
|
| 150 | + return ucfirst($type); |
|
| 151 | + } elseif ($type == 'sql') { |
|
| 152 | + return strtoupper($type); |
|
| 153 | + } |
|
| 154 | + } |
|
| 155 | + |
|
| 156 | + public function configureAssets() |
|
| 157 | + { |
|
| 158 | + $assets = Assets::instance(); |
|
| 159 | + $this->app->set('ASSETS.onFileNotFound', function ($file) { |
|
| 160 | + echo 'file not found: '.$file; |
|
| 161 | + }); |
|
| 162 | + } |
|
| 163 | + |
|
| 164 | + public function registerErrorHandler() |
|
| 165 | + { |
|
| 166 | + if ($this->app->DEV) { |
|
| 167 | + Falsum\Run::handler($this->app->DEBUG != 3); |
|
| 168 | + } else { |
|
| 169 | + $this->app->set('ONERROR', 'App\Core\Controllers\ErrorController->init'); |
|
| 170 | + } |
|
| 171 | + } |
|
| 172 | 172 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | { |
| 17 | 17 | if (Registry::exists('APP')) { |
| 18 | 18 | $app = Registry::get('APP'); |
| 19 | - } else { |
|
| 19 | + }else { |
|
| 20 | 20 | $app = new self; |
| 21 | 21 | Registry::set('APP', $app); |
| 22 | 22 | } |
@@ -81,7 +81,7 @@ discard block |
||
| 81 | 81 | { |
| 82 | 82 | if ($file) { |
| 83 | 83 | $this->app->config(base_path("{path}/{$file}")); |
| 84 | - } else { |
|
| 84 | + }else { |
|
| 85 | 85 | foreach (glob(base_path("{$path}/*.ini")) as $file) { |
| 86 | 86 | $this->app->config($file); |
| 87 | 87 | } |
@@ -126,11 +126,11 @@ discard block |
||
| 126 | 126 | $this->configureCSRF($type); |
| 127 | 127 | } elseif ($this->app->CSRF) { |
| 128 | 128 | $this->session = new Session(null, 'CSRF'); |
| 129 | - } else { |
|
| 129 | + }else { |
|
| 130 | 130 | if ($type == 'jig' || $type == 'mongo' || $type == 'sql') { |
| 131 | 131 | $session = str_ireplace('/', '', 'DB\/'.$this->_getDBType($type).'\Session'); |
| 132 | 132 | $this->session = new $session($this->app->DB); |
| 133 | - } else { |
|
| 133 | + }else { |
|
| 134 | 134 | $this->session = new Session(); |
| 135 | 135 | } |
| 136 | 136 | } |
@@ -156,7 +156,7 @@ discard block |
||
| 156 | 156 | public function configureAssets() |
| 157 | 157 | { |
| 158 | 158 | $assets = Assets::instance(); |
| 159 | - $this->app->set('ASSETS.onFileNotFound', function ($file) { |
|
| 159 | + $this->app->set('ASSETS.onFileNotFound', function($file) { |
|
| 160 | 160 | echo 'file not found: '.$file; |
| 161 | 161 | }); |
| 162 | 162 | } |
@@ -165,7 +165,7 @@ discard block |
||
| 165 | 165 | { |
| 166 | 166 | if ($this->app->DEV) { |
| 167 | 167 | Falsum\Run::handler($this->app->DEBUG != 3); |
| 168 | - } else { |
|
| 168 | + }else { |
|
| 169 | 169 | $this->app->set('ONERROR', 'App\Core\Controllers\ErrorController->init'); |
| 170 | 170 | } |
| 171 | 171 | } |
@@ -2,110 +2,110 @@ |
||
| 2 | 2 | |
| 3 | 3 | function f3($get = null) |
| 4 | 4 | { |
| 5 | - $f3 = Base::instance(); |
|
| 6 | - return $get ? $f3->get($get) : $f3; |
|
| 5 | + $f3 = Base::instance(); |
|
| 6 | + return $get ? $f3->get($get) : $f3; |
|
| 7 | 7 | } |
| 8 | 8 | |
| 9 | 9 | function base_path($inner = '') |
| 10 | 10 | { |
| 11 | - return realpath(__DIR__.'/../').'/'.$inner; |
|
| 11 | + return realpath(__DIR__.'/../').'/'.$inner; |
|
| 12 | 12 | } |
| 13 | 13 | function storage_path($inner = '') |
| 14 | 14 | { |
| 15 | - return base_path('storage/').'/'.$inner; |
|
| 15 | + return base_path('storage/').'/'.$inner; |
|
| 16 | 16 | } |
| 17 | 17 | function db_path($db = '') |
| 18 | 18 | { |
| 19 | - return storage_path('db/').$db; |
|
| 19 | + return storage_path('db/').$db; |
|
| 20 | 20 | } |
| 21 | 21 | function lang_path($lang = '') |
| 22 | 22 | { |
| 23 | - return base_path('resources/lang/').'/'.$lang; |
|
| 23 | + return base_path('resources/lang/').'/'.$lang; |
|
| 24 | 24 | } |
| 25 | 25 | function views_path() |
| 26 | 26 | { |
| 27 | - return base_path('resources/views/'); |
|
| 27 | + return base_path('resources/views/'); |
|
| 28 | 28 | } |
| 29 | 29 | function config_path($config = '') |
| 30 | 30 | { |
| 31 | - return base_path('config/').'/'.$config; |
|
| 31 | + return base_path('config/').'/'.$config; |
|
| 32 | 32 | } |
| 33 | 33 | |
| 34 | 34 | function abort() |
| 35 | 35 | { |
| 36 | - f3()->abort(); |
|
| 36 | + f3()->abort(); |
|
| 37 | 37 | } |
| 38 | 38 | function status($code = 404) |
| 39 | 39 | { |
| 40 | - f3()->error($code); |
|
| 40 | + f3()->error($code); |
|
| 41 | 41 | } |
| 42 | 42 | function reroute($where) |
| 43 | 43 | { |
| 44 | - f3()->reroute($where); |
|
| 44 | + f3()->reroute($where); |
|
| 45 | 45 | } |
| 46 | 46 | function is_api($path) |
| 47 | 47 | { |
| 48 | - if (is_string($path)) { |
|
| 49 | - return explode('/', $path)[1] === 'api'; |
|
| 50 | - } |
|
| 51 | - return false; |
|
| 48 | + if (is_string($path)) { |
|
| 49 | + return explode('/', $path)[1] === 'api'; |
|
| 50 | + } |
|
| 51 | + return false; |
|
| 52 | 52 | } |
| 53 | 53 | |
| 54 | 54 | function template($template, array $params = [], $mime = 'text/html') |
| 55 | 55 | { |
| 56 | - $f3 = f3(); |
|
| 57 | - if (!empty($params)) { |
|
| 58 | - $f3->mset($params); |
|
| 59 | - } |
|
| 60 | - if (is_array($template)) { |
|
| 61 | - $layout = $template[0]; |
|
| 62 | - $view = $template[1]; |
|
| 63 | - } else { |
|
| 64 | - $layout = 'layouts/app.htm'; |
|
| 65 | - $view = $template; |
|
| 66 | - } |
|
| 67 | - $f3->set('user', App::instance()->user()); |
|
| 68 | - $f3->set('content', extension($view, 'htm')); |
|
| 69 | - echo Template::instance()->render($layout, $mime); |
|
| 56 | + $f3 = f3(); |
|
| 57 | + if (!empty($params)) { |
|
| 58 | + $f3->mset($params); |
|
| 59 | + } |
|
| 60 | + if (is_array($template)) { |
|
| 61 | + $layout = $template[0]; |
|
| 62 | + $view = $template[1]; |
|
| 63 | + } else { |
|
| 64 | + $layout = 'layouts/app.htm'; |
|
| 65 | + $view = $template; |
|
| 66 | + } |
|
| 67 | + $f3->set('user', App::instance()->user()); |
|
| 68 | + $f3->set('content', extension($view, 'htm')); |
|
| 69 | + echo Template::instance()->render($layout, $mime); |
|
| 70 | 70 | } |
| 71 | 71 | |
| 72 | 72 | function str_contains($haystack, $needles) |
| 73 | 73 | { |
| 74 | - foreach ((array) $needles as $needle) { |
|
| 75 | - if ($needle != '' && mb_strpos($haystack, $needle) !== false) { |
|
| 76 | - return true; |
|
| 77 | - } |
|
| 78 | - } |
|
| 79 | - return false; |
|
| 74 | + foreach ((array) $needles as $needle) { |
|
| 75 | + if ($needle != '' && mb_strpos($haystack, $needle) !== false) { |
|
| 76 | + return true; |
|
| 77 | + } |
|
| 78 | + } |
|
| 79 | + return false; |
|
| 80 | 80 | } |
| 81 | 81 | function extension($file, $default = 'json') |
| 82 | 82 | { |
| 83 | - return $file.'.'.(pathinfo($file, PATHINFO_EXTENSION) ?: $default); |
|
| 83 | + return $file.'.'.(pathinfo($file, PATHINFO_EXTENSION) ?: $default); |
|
| 84 | 84 | } |
| 85 | 85 | function flash($message, $type = 'success') |
| 86 | 86 | { |
| 87 | - Flash::instance()->addMessage($message, $type); |
|
| 87 | + Flash::instance()->addMessage($message, $type); |
|
| 88 | 88 | } |
| 89 | 89 | function trans($key, $params = null) |
| 90 | 90 | { |
| 91 | - return f3()->format(f3()->get($key), ($params ?: '')); |
|
| 91 | + return f3()->format(f3()->get($key), ($params ?: '')); |
|
| 92 | 92 | } |
| 93 | 93 | function error($error) |
| 94 | 94 | { |
| 95 | - if (null === $error) { |
|
| 96 | - return; |
|
| 97 | - } |
|
| 98 | - if (is_array($error)) { |
|
| 99 | - foreach ($error as $err) { |
|
| 100 | - if (is_array($err)) { |
|
| 101 | - foreach ($err as $e) { |
|
| 102 | - flash($e, 'danger'); |
|
| 103 | - } |
|
| 104 | - } else { |
|
| 105 | - flash($err, 'danger'); |
|
| 106 | - } |
|
| 107 | - } |
|
| 108 | - } else { |
|
| 109 | - flash($error, 'danger'); |
|
| 110 | - } |
|
| 95 | + if (null === $error) { |
|
| 96 | + return; |
|
| 97 | + } |
|
| 98 | + if (is_array($error)) { |
|
| 99 | + foreach ($error as $err) { |
|
| 100 | + if (is_array($err)) { |
|
| 101 | + foreach ($err as $e) { |
|
| 102 | + flash($e, 'danger'); |
|
| 103 | + } |
|
| 104 | + } else { |
|
| 105 | + flash($err, 'danger'); |
|
| 106 | + } |
|
| 107 | + } |
|
| 108 | + } else { |
|
| 109 | + flash($error, 'danger'); |
|
| 110 | + } |
|
| 111 | 111 | } |
@@ -60,7 +60,7 @@ discard block |
||
| 60 | 60 | if (is_array($template)) { |
| 61 | 61 | $layout = $template[0]; |
| 62 | 62 | $view = $template[1]; |
| 63 | - } else { |
|
| 63 | + }else { |
|
| 64 | 64 | $layout = 'layouts/app.htm'; |
| 65 | 65 | $view = $template; |
| 66 | 66 | } |
@@ -101,11 +101,11 @@ discard block |
||
| 101 | 101 | foreach ($err as $e) { |
| 102 | 102 | flash($e, 'danger'); |
| 103 | 103 | } |
| 104 | - } else { |
|
| 104 | + }else { |
|
| 105 | 105 | flash($err, 'danger'); |
| 106 | 106 | } |
| 107 | 107 | } |
| 108 | - } else { |
|
| 108 | + }else { |
|
| 109 | 109 | flash($error, 'danger'); |
| 110 | 110 | } |
| 111 | 111 | } |
@@ -2,262 +2,262 @@ |
||
| 2 | 2 | |
| 3 | 3 | class Str extends Prefab |
| 4 | 4 | { |
| 5 | - protected static $snakeCache = []; |
|
| 6 | - protected static $camelCache = []; |
|
| 7 | - protected static $studlyCache = []; |
|
| 5 | + protected static $snakeCache = []; |
|
| 6 | + protected static $camelCache = []; |
|
| 7 | + protected static $studlyCache = []; |
|
| 8 | 8 | |
| 9 | - public static function after($subject, $search) |
|
| 10 | - { |
|
| 11 | - return $search === '' ? $subject : array_reverse(explode($search, $subject, 2))[0]; |
|
| 12 | - } |
|
| 13 | - |
|
| 14 | - public static function before($subject, $search) |
|
| 15 | - { |
|
| 16 | - return $search === '' ? $subject : explode($search, $subject)[0]; |
|
| 17 | - } |
|
| 18 | - |
|
| 19 | - public static function camel($value) |
|
| 20 | - { |
|
| 21 | - if (isset(static::$camelCache[$value])) { |
|
| 22 | - return static::$camelCache[$value]; |
|
| 23 | - } |
|
| 24 | - |
|
| 25 | - return static::$camelCache[$value] = lcfirst(static::studly($value)); |
|
| 26 | - } |
|
| 27 | - |
|
| 28 | - public static function contains($haystack, $needles) |
|
| 29 | - { |
|
| 30 | - foreach ((array) $needles as $needle) { |
|
| 31 | - if ($needle !== '' && mb_strpos($haystack, $needle) !== false) { |
|
| 32 | - return true; |
|
| 33 | - } |
|
| 34 | - } |
|
| 35 | - |
|
| 36 | - return false; |
|
| 37 | - } |
|
| 38 | - |
|
| 39 | - public static function endsWith($haystack, $needles) |
|
| 40 | - { |
|
| 41 | - foreach ((array) $needles as $needle) { |
|
| 42 | - if (substr($haystack, -strlen($needle)) === (string) $needle) { |
|
| 43 | - return true; |
|
| 44 | - } |
|
| 45 | - } |
|
| 46 | - |
|
| 47 | - return false; |
|
| 48 | - } |
|
| 49 | - |
|
| 50 | - public static function finish($value, $cap) |
|
| 51 | - { |
|
| 52 | - $quoted = preg_quote($cap, '/'); |
|
| 53 | - |
|
| 54 | - return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap; |
|
| 55 | - } |
|
| 56 | - |
|
| 57 | - public static function is($pattern, $value) |
|
| 58 | - { |
|
| 59 | - $patterns = is_array($pattern) ? $pattern : (array) $pattern; |
|
| 60 | - |
|
| 61 | - if (empty($patterns)) { |
|
| 62 | - return false; |
|
| 63 | - } |
|
| 64 | - |
|
| 65 | - foreach ($patterns as $pattern) { |
|
| 66 | - if ($pattern == $value) { |
|
| 67 | - return true; |
|
| 68 | - } |
|
| 69 | - |
|
| 70 | - $pattern = preg_quote($pattern, '#'); |
|
| 71 | - $pattern = str_replace('\*', '.*', $pattern); |
|
| 72 | - |
|
| 73 | - if (preg_match('#^'.$pattern.'\z#u', $value) === 1) { |
|
| 74 | - return true; |
|
| 75 | - } |
|
| 76 | - } |
|
| 77 | - |
|
| 78 | - return false; |
|
| 79 | - } |
|
| 80 | - |
|
| 81 | - public static function kebab($value) |
|
| 82 | - { |
|
| 83 | - return static::snake($value, '-'); |
|
| 84 | - } |
|
| 85 | - |
|
| 86 | - public static function length($value, $encoding = null) |
|
| 87 | - { |
|
| 88 | - if ($encoding) { |
|
| 89 | - return mb_strlen($value, $encoding); |
|
| 90 | - } |
|
| 91 | - |
|
| 92 | - return mb_strlen($value); |
|
| 93 | - } |
|
| 94 | - |
|
| 95 | - public static function limit($value, $limit = 100, $end = '...') |
|
| 96 | - { |
|
| 97 | - if (mb_strwidth($value, 'UTF-8') <= $limit) { |
|
| 98 | - return $value; |
|
| 99 | - } |
|
| 100 | - |
|
| 101 | - return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end; |
|
| 102 | - } |
|
| 103 | - |
|
| 104 | - public static function lower($value) |
|
| 105 | - { |
|
| 106 | - return mb_strtolower($value, 'UTF-8'); |
|
| 107 | - } |
|
| 108 | - |
|
| 109 | - public static function words($value, $words = 100, $end = '...') |
|
| 110 | - { |
|
| 111 | - preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/u', $value, $matches); |
|
| 112 | - |
|
| 113 | - if (!isset($matches[0]) || static::length($value) === static::length($matches[0])) { |
|
| 114 | - return $value; |
|
| 115 | - } |
|
| 116 | - |
|
| 117 | - return rtrim($matches[0]).$end; |
|
| 118 | - } |
|
| 119 | - |
|
| 120 | - public static function parseCallback($callback, $default = null) |
|
| 121 | - { |
|
| 122 | - return static::contains($callback, '@') ? explode('@', $callback, 2) : [$callback, $default]; |
|
| 123 | - } |
|
| 124 | - |
|
| 125 | - public static function plural($value, $count = 2) |
|
| 126 | - { |
|
| 127 | - return Pluralizer::plural($value, $count); |
|
| 128 | - } |
|
| 129 | - |
|
| 130 | - public static function random($length = 16) |
|
| 131 | - { |
|
| 132 | - $string = ''; |
|
| 133 | - |
|
| 134 | - while (($len = strlen($string)) < $length) { |
|
| 135 | - $size = $length - $len; |
|
| 136 | - $bytes = random_bytes($size); |
|
| 137 | - $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size); |
|
| 138 | - } |
|
| 139 | - |
|
| 140 | - return $string; |
|
| 141 | - } |
|
| 142 | - |
|
| 143 | - public static function replaceArray($search, array $replace, $subject) |
|
| 144 | - { |
|
| 145 | - foreach ($replace as $value) { |
|
| 146 | - $subject = static::replaceFirst($search, $value, $subject); |
|
| 147 | - } |
|
| 148 | - |
|
| 149 | - return $subject; |
|
| 150 | - } |
|
| 151 | - |
|
| 152 | - public static function replaceFirst($search, $replace, $subject) |
|
| 153 | - { |
|
| 154 | - if ($search == '') { |
|
| 155 | - return $subject; |
|
| 156 | - } |
|
| 157 | - |
|
| 158 | - $position = strpos($subject, $search); |
|
| 159 | - |
|
| 160 | - if ($position !== false) { |
|
| 161 | - return substr_replace($subject, $replace, $position, strlen($search)); |
|
| 162 | - } |
|
| 163 | - |
|
| 164 | - return $subject; |
|
| 165 | - } |
|
| 166 | - |
|
| 167 | - public static function replaceLast($search, $replace, $subject) |
|
| 168 | - { |
|
| 169 | - $position = strrpos($subject, $search); |
|
| 170 | - |
|
| 171 | - if ($position !== false) { |
|
| 172 | - return substr_replace($subject, $replace, $position, strlen($search)); |
|
| 173 | - } |
|
| 174 | - |
|
| 175 | - return $subject; |
|
| 176 | - } |
|
| 177 | - |
|
| 178 | - public static function start($value, $prefix) |
|
| 179 | - { |
|
| 180 | - $quoted = preg_quote($prefix, '/'); |
|
| 181 | - return $prefix.preg_replace('/^(?:'.$quoted.')+/u', '', $value); |
|
| 182 | - } |
|
| 183 | - |
|
| 184 | - public static function upper($value) |
|
| 185 | - { |
|
| 186 | - return mb_strtoupper($value, 'UTF-8'); |
|
| 187 | - } |
|
| 188 | - |
|
| 189 | - public static function title($value) |
|
| 190 | - { |
|
| 191 | - return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8'); |
|
| 192 | - } |
|
| 193 | - |
|
| 194 | - public static function singular($value) |
|
| 195 | - { |
|
| 196 | - return Pluralizer::singular($value); |
|
| 197 | - } |
|
| 198 | - |
|
| 199 | - public static function slug($title, $separator = '-', $language = 'en') |
|
| 200 | - { |
|
| 201 | - $title = static::ascii($title, $language); |
|
| 202 | - |
|
| 203 | - $flip = $separator == '-' ? '_' : '-'; |
|
| 204 | - |
|
| 205 | - $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title); |
|
| 206 | - $title = str_replace('@', $separator.'at'.$separator, $title); |
|
| 207 | - $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($title)); |
|
| 208 | - $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title); |
|
| 209 | - |
|
| 210 | - return trim($title, $separator); |
|
| 211 | - } |
|
| 9 | + public static function after($subject, $search) |
|
| 10 | + { |
|
| 11 | + return $search === '' ? $subject : array_reverse(explode($search, $subject, 2))[0]; |
|
| 12 | + } |
|
| 13 | + |
|
| 14 | + public static function before($subject, $search) |
|
| 15 | + { |
|
| 16 | + return $search === '' ? $subject : explode($search, $subject)[0]; |
|
| 17 | + } |
|
| 18 | + |
|
| 19 | + public static function camel($value) |
|
| 20 | + { |
|
| 21 | + if (isset(static::$camelCache[$value])) { |
|
| 22 | + return static::$camelCache[$value]; |
|
| 23 | + } |
|
| 24 | + |
|
| 25 | + return static::$camelCache[$value] = lcfirst(static::studly($value)); |
|
| 26 | + } |
|
| 27 | + |
|
| 28 | + public static function contains($haystack, $needles) |
|
| 29 | + { |
|
| 30 | + foreach ((array) $needles as $needle) { |
|
| 31 | + if ($needle !== '' && mb_strpos($haystack, $needle) !== false) { |
|
| 32 | + return true; |
|
| 33 | + } |
|
| 34 | + } |
|
| 35 | + |
|
| 36 | + return false; |
|
| 37 | + } |
|
| 38 | + |
|
| 39 | + public static function endsWith($haystack, $needles) |
|
| 40 | + { |
|
| 41 | + foreach ((array) $needles as $needle) { |
|
| 42 | + if (substr($haystack, -strlen($needle)) === (string) $needle) { |
|
| 43 | + return true; |
|
| 44 | + } |
|
| 45 | + } |
|
| 46 | + |
|
| 47 | + return false; |
|
| 48 | + } |
|
| 49 | + |
|
| 50 | + public static function finish($value, $cap) |
|
| 51 | + { |
|
| 52 | + $quoted = preg_quote($cap, '/'); |
|
| 53 | + |
|
| 54 | + return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap; |
|
| 55 | + } |
|
| 56 | + |
|
| 57 | + public static function is($pattern, $value) |
|
| 58 | + { |
|
| 59 | + $patterns = is_array($pattern) ? $pattern : (array) $pattern; |
|
| 60 | + |
|
| 61 | + if (empty($patterns)) { |
|
| 62 | + return false; |
|
| 63 | + } |
|
| 64 | + |
|
| 65 | + foreach ($patterns as $pattern) { |
|
| 66 | + if ($pattern == $value) { |
|
| 67 | + return true; |
|
| 68 | + } |
|
| 69 | + |
|
| 70 | + $pattern = preg_quote($pattern, '#'); |
|
| 71 | + $pattern = str_replace('\*', '.*', $pattern); |
|
| 72 | + |
|
| 73 | + if (preg_match('#^'.$pattern.'\z#u', $value) === 1) { |
|
| 74 | + return true; |
|
| 75 | + } |
|
| 76 | + } |
|
| 77 | + |
|
| 78 | + return false; |
|
| 79 | + } |
|
| 80 | + |
|
| 81 | + public static function kebab($value) |
|
| 82 | + { |
|
| 83 | + return static::snake($value, '-'); |
|
| 84 | + } |
|
| 85 | + |
|
| 86 | + public static function length($value, $encoding = null) |
|
| 87 | + { |
|
| 88 | + if ($encoding) { |
|
| 89 | + return mb_strlen($value, $encoding); |
|
| 90 | + } |
|
| 91 | + |
|
| 92 | + return mb_strlen($value); |
|
| 93 | + } |
|
| 94 | + |
|
| 95 | + public static function limit($value, $limit = 100, $end = '...') |
|
| 96 | + { |
|
| 97 | + if (mb_strwidth($value, 'UTF-8') <= $limit) { |
|
| 98 | + return $value; |
|
| 99 | + } |
|
| 100 | + |
|
| 101 | + return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end; |
|
| 102 | + } |
|
| 103 | + |
|
| 104 | + public static function lower($value) |
|
| 105 | + { |
|
| 106 | + return mb_strtolower($value, 'UTF-8'); |
|
| 107 | + } |
|
| 108 | + |
|
| 109 | + public static function words($value, $words = 100, $end = '...') |
|
| 110 | + { |
|
| 111 | + preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/u', $value, $matches); |
|
| 112 | + |
|
| 113 | + if (!isset($matches[0]) || static::length($value) === static::length($matches[0])) { |
|
| 114 | + return $value; |
|
| 115 | + } |
|
| 116 | + |
|
| 117 | + return rtrim($matches[0]).$end; |
|
| 118 | + } |
|
| 119 | + |
|
| 120 | + public static function parseCallback($callback, $default = null) |
|
| 121 | + { |
|
| 122 | + return static::contains($callback, '@') ? explode('@', $callback, 2) : [$callback, $default]; |
|
| 123 | + } |
|
| 124 | + |
|
| 125 | + public static function plural($value, $count = 2) |
|
| 126 | + { |
|
| 127 | + return Pluralizer::plural($value, $count); |
|
| 128 | + } |
|
| 129 | + |
|
| 130 | + public static function random($length = 16) |
|
| 131 | + { |
|
| 132 | + $string = ''; |
|
| 133 | + |
|
| 134 | + while (($len = strlen($string)) < $length) { |
|
| 135 | + $size = $length - $len; |
|
| 136 | + $bytes = random_bytes($size); |
|
| 137 | + $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size); |
|
| 138 | + } |
|
| 139 | + |
|
| 140 | + return $string; |
|
| 141 | + } |
|
| 142 | + |
|
| 143 | + public static function replaceArray($search, array $replace, $subject) |
|
| 144 | + { |
|
| 145 | + foreach ($replace as $value) { |
|
| 146 | + $subject = static::replaceFirst($search, $value, $subject); |
|
| 147 | + } |
|
| 148 | + |
|
| 149 | + return $subject; |
|
| 150 | + } |
|
| 151 | + |
|
| 152 | + public static function replaceFirst($search, $replace, $subject) |
|
| 153 | + { |
|
| 154 | + if ($search == '') { |
|
| 155 | + return $subject; |
|
| 156 | + } |
|
| 157 | + |
|
| 158 | + $position = strpos($subject, $search); |
|
| 159 | + |
|
| 160 | + if ($position !== false) { |
|
| 161 | + return substr_replace($subject, $replace, $position, strlen($search)); |
|
| 162 | + } |
|
| 163 | + |
|
| 164 | + return $subject; |
|
| 165 | + } |
|
| 166 | + |
|
| 167 | + public static function replaceLast($search, $replace, $subject) |
|
| 168 | + { |
|
| 169 | + $position = strrpos($subject, $search); |
|
| 170 | + |
|
| 171 | + if ($position !== false) { |
|
| 172 | + return substr_replace($subject, $replace, $position, strlen($search)); |
|
| 173 | + } |
|
| 174 | + |
|
| 175 | + return $subject; |
|
| 176 | + } |
|
| 177 | + |
|
| 178 | + public static function start($value, $prefix) |
|
| 179 | + { |
|
| 180 | + $quoted = preg_quote($prefix, '/'); |
|
| 181 | + return $prefix.preg_replace('/^(?:'.$quoted.')+/u', '', $value); |
|
| 182 | + } |
|
| 183 | + |
|
| 184 | + public static function upper($value) |
|
| 185 | + { |
|
| 186 | + return mb_strtoupper($value, 'UTF-8'); |
|
| 187 | + } |
|
| 188 | + |
|
| 189 | + public static function title($value) |
|
| 190 | + { |
|
| 191 | + return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8'); |
|
| 192 | + } |
|
| 193 | + |
|
| 194 | + public static function singular($value) |
|
| 195 | + { |
|
| 196 | + return Pluralizer::singular($value); |
|
| 197 | + } |
|
| 198 | + |
|
| 199 | + public static function slug($title, $separator = '-', $language = 'en') |
|
| 200 | + { |
|
| 201 | + $title = static::ascii($title, $language); |
|
| 202 | + |
|
| 203 | + $flip = $separator == '-' ? '_' : '-'; |
|
| 204 | + |
|
| 205 | + $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title); |
|
| 206 | + $title = str_replace('@', $separator.'at'.$separator, $title); |
|
| 207 | + $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($title)); |
|
| 208 | + $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title); |
|
| 209 | + |
|
| 210 | + return trim($title, $separator); |
|
| 211 | + } |
|
| 212 | 212 | |
| 213 | - public static function snake($value, $delimiter = '_') |
|
| 214 | - { |
|
| 215 | - $key = $value; |
|
| 213 | + public static function snake($value, $delimiter = '_') |
|
| 214 | + { |
|
| 215 | + $key = $value; |
|
| 216 | 216 | |
| 217 | - if (isset(static::$snakeCache[$key][$delimiter])) { |
|
| 218 | - return static::$snakeCache[$key][$delimiter]; |
|
| 219 | - } |
|
| 220 | - |
|
| 221 | - if (!ctype_lower($value)) { |
|
| 222 | - $value = preg_replace('/\s+/u', '', ucwords($value)); |
|
| 223 | - |
|
| 224 | - $value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value)); |
|
| 225 | - } |
|
| 226 | - |
|
| 227 | - return static::$snakeCache[$key][$delimiter] = $value; |
|
| 228 | - } |
|
| 217 | + if (isset(static::$snakeCache[$key][$delimiter])) { |
|
| 218 | + return static::$snakeCache[$key][$delimiter]; |
|
| 219 | + } |
|
| 220 | + |
|
| 221 | + if (!ctype_lower($value)) { |
|
| 222 | + $value = preg_replace('/\s+/u', '', ucwords($value)); |
|
| 223 | + |
|
| 224 | + $value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value)); |
|
| 225 | + } |
|
| 226 | + |
|
| 227 | + return static::$snakeCache[$key][$delimiter] = $value; |
|
| 228 | + } |
|
| 229 | 229 | |
| 230 | - public static function startsWith($haystack, $needles) |
|
| 231 | - { |
|
| 232 | - foreach ((array) $needles as $needle) { |
|
| 233 | - if ($needle !== '' && substr($haystack, 0, strlen($needle)) === (string) $needle) { |
|
| 234 | - return true; |
|
| 235 | - } |
|
| 236 | - } |
|
| 230 | + public static function startsWith($haystack, $needles) |
|
| 231 | + { |
|
| 232 | + foreach ((array) $needles as $needle) { |
|
| 233 | + if ($needle !== '' && substr($haystack, 0, strlen($needle)) === (string) $needle) { |
|
| 234 | + return true; |
|
| 235 | + } |
|
| 236 | + } |
|
| 237 | 237 | |
| 238 | - return false; |
|
| 239 | - } |
|
| 238 | + return false; |
|
| 239 | + } |
|
| 240 | 240 | |
| 241 | - public static function studly($value) |
|
| 242 | - { |
|
| 243 | - $key = $value; |
|
| 241 | + public static function studly($value) |
|
| 242 | + { |
|
| 243 | + $key = $value; |
|
| 244 | 244 | |
| 245 | - if (isset(static::$studlyCache[$key])) { |
|
| 246 | - return static::$studlyCache[$key]; |
|
| 247 | - } |
|
| 245 | + if (isset(static::$studlyCache[$key])) { |
|
| 246 | + return static::$studlyCache[$key]; |
|
| 247 | + } |
|
| 248 | 248 | |
| 249 | - $value = ucwords(str_replace(['-', '_'], ' ', $value)); |
|
| 249 | + $value = ucwords(str_replace(['-', '_'], ' ', $value)); |
|
| 250 | 250 | |
| 251 | - return static::$studlyCache[$key] = str_replace(' ', '', $value); |
|
| 252 | - } |
|
| 251 | + return static::$studlyCache[$key] = str_replace(' ', '', $value); |
|
| 252 | + } |
|
| 253 | 253 | |
| 254 | - public static function substr($string, $start, $length = null) |
|
| 255 | - { |
|
| 256 | - return mb_substr($string, $start, $length, 'UTF-8'); |
|
| 257 | - } |
|
| 254 | + public static function substr($string, $start, $length = null) |
|
| 255 | + { |
|
| 256 | + return mb_substr($string, $start, $length, 'UTF-8'); |
|
| 257 | + } |
|
| 258 | 258 | |
| 259 | - public static function ucfirst($string) |
|
| 260 | - { |
|
| 261 | - return static::upper(static::substr($string, 0, 1)).static::substr($string, 1); |
|
| 262 | - } |
|
| 259 | + public static function ucfirst($string) |
|
| 260 | + { |
|
| 261 | + return static::upper(static::substr($string, 0, 1)).static::substr($string, 1); |
|
| 262 | + } |
|
| 263 | 263 | } |