├── src ├── models │ └── .gitignore ├── .htaccess ├── controllers │ └── DefaultController.php └── views │ └── default │ └── index.php ├── .gitignore ├── .htaccess ├── web └── assets │ ├── favicon.ico │ ├── img │ ├── launch.png │ └── index.html │ ├── css │ └── index.html │ ├── js │ └── index.html │ └── fonts │ └── index.html ├── system ├── webroot │ ├── .htaccess │ └── FrontController.php ├── core │ ├── Request.php │ ├── Dispatcher.php │ └── Router.php ├── Model.php ├── Assets.php └── Controller.php ├── .env.example ├── composer.json ├── .github └── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── template └── base.php ├── README.md └── composer.lock /src/models/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | .idea 3 | .env -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | RewriteEngine on 2 | RewriteRule ^([a-zA-Z0-9\-\_\/]*)$ system/webroot/$1 -------------------------------------------------------------------------------- /web/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lignedev/ligne_php/HEAD/web/assets/favicon.ico -------------------------------------------------------------------------------- /web/assets/img/launch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lignedev/ligne_php/HEAD/web/assets/img/launch.png -------------------------------------------------------------------------------- /src/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Require all denied 3 | 4 | 5 | Deny from all 6 | -------------------------------------------------------------------------------- /system/webroot/.htaccess: -------------------------------------------------------------------------------- 1 | RewriteEngine on 2 | RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png)$ [NC] 3 | RewriteRule ^([a-zA-Z0-9\-\_\/]*)$ FrontController.php?p=$1 [L,QSA] -------------------------------------------------------------------------------- /system/core/Request.php: -------------------------------------------------------------------------------- 1 | url = $_SERVER["REQUEST_URI"]; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # 2 | HOST= 3 | 4 | USER= 5 | 6 | PASSWORD= 7 | 8 | DB_NAME= 9 | 10 | # Support MySQL, pgsl(Postgres) 11 | DRIVER= 12 | 13 | CHARSET=utf8 14 | 15 | COLLATION=utf8_general_ci 16 | 17 | #For example in postgres used the schema and end on dot, public. 18 | PREFIX= 19 | 20 | #If not set, use the default of the database set driver 21 | PORT= 22 | -------------------------------------------------------------------------------- /web/assets/css/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 403 Forbidden 9 | 10 | 11 |

Directory access is forbidden.

12 | 13 | -------------------------------------------------------------------------------- /web/assets/img/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 403 Forbidden 9 | 10 | 11 |

Directory access is forbidden.

12 | 13 | -------------------------------------------------------------------------------- /web/assets/js/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 403 Forbidden 9 | 10 | 11 |

Directory access is forbidden.

12 | 13 | -------------------------------------------------------------------------------- /web/assets/fonts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 403 Forbidden 9 | 10 | 11 |

Directory access is forbidden.

12 | 13 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ligne/ligne", 3 | "description": "Ligne PHP Framework", 4 | "type": "project", 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "Albert E. Hidalgo Taveras", 9 | "email": "itsalb3rt@gmail.com" 10 | } 11 | ], 12 | "require": { 13 | "izniburak/pdox": "^1.3", 14 | "ligne/error-handler": "^1.1", 15 | "vlucas/phpdotenv": "^5.0" 16 | }, 17 | "autoload": { 18 | "psr-4": { 19 | "App\\": "src/", 20 | "System\\": "system/" 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /template/base.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | <?= $pageTitle ?> 11 | 12 | 13 | 19 | 20 | -------------------------------------------------------------------------------- /src/controllers/DefaultController.php: -------------------------------------------------------------------------------- 1 | setData($data); 28 | $this->render("index",'Ligne 2'); 29 | } 30 | } -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /system/Model.php: -------------------------------------------------------------------------------- 1 | bdd)) { 18 | /** 19 | * Load the database credentials of the config file 20 | */ 21 | $this->credentials = $_ENV; 22 | 23 | $this->config = [ 24 | 'host' => $this->credentials["HOST"], 25 | 'driver' => $this->credentials["DRIVER"], 26 | 'database' => $this->credentials["DB_NAME"], 27 | 'username' => $this->credentials["USER"], 28 | 'password' => $this->credentials["PASSWORD"], 29 | 'charset' => $this->credentials["CHARSET"], 30 | 'collation' => $this->credentials["COLLATION"], 31 | 'prefix' => $this->credentials["PREFIX"], 32 | 'port' => $this->credentials["PORT"], 33 | 'debug' =>false 34 | ]; 35 | /** 36 | * Load PDOX query builder for create a OOP abstraction for 37 | * database 38 | **/ 39 | $this->bdd = new Pdox($this->config); 40 | } 41 | return $this->bdd; 42 | } 43 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ligne Framework 🐘 2 | 3 | --- 4 | 5 | Ligne es un "Framework" **MVC** que ejecuta PHP 7.1.3 o superior. Prácticamente ya todo está preparado, solo necesita realizar algunas configuraciones mínimas y puedes comenzar a trabajar. 6 | 7 | ## 🛠️Instalación 8 | 9 | Ligne utiliza **[composer](https://getcomposer.org/)** para manejar sus dependencias. Antes de continuar asegúrate que ya lo tienes instalado. 10 | 11 | 12 | ## 📚Documentación 13 | 14 | El siguiente enlace te lleva a la documentación, la misma es actualizada con cada actualización del framework por lo que puedes estar seguro que todos los nuevos cambios ya se incluyen en ella. 15 | 16 | - **[Guía de introducción ](https://ligne-framework.gitbook.io/ligne-framework-php/)** 17 | - Aplicación de demostración **[ToDoApp](https://github.com/itsalb3rt/ToDoApp)** 18 | 19 | ## 🏢Arquitectura Global 20 | 21 | ![](https://i.imgur.com/vDLo9hG.png) 22 | 23 | 24 | ## Rutas 25 | Vista rapida de una **url** con el framework 26 | 27 | ![enter image description here](https://i.imgur.com/kHEWAwK.png) 28 | 29 | # 🚀 Creditos: 30 | 31 | - **Desarrollado y mantenido por:** [@itsalb3rt](https://github.com/itsalb3rt "@itsalb3rt") 32 | - **QueryBuilder PDOx :** [@izniburak](https://github.com/izniburak "@izniburak") 33 | - **Documentación en GitBook :** [@Darknet17](https://github.com/izniburak "@Darknet17") 34 | - **Revision de documentación:** Walner Betances 35 | - **Inspiración:** Yanibel Ligne Gutierrez Mercado 36 | 37 | -------------------------------------------------------------------------------- /system/webroot/FrontController.php: -------------------------------------------------------------------------------- 1 | =') == false ){ 13 | echo ''; 14 | echo 'Versión | Error'; 15 | echo '
'; 16 | echo '

Versión no compatible

'; 17 | echo '

Invalid PHP version, please update up to 7.1.3

'; 18 | echo '
'; 19 | die(); 20 | } 21 | 22 | /** 23 | * Global scope constant for specific the protocol to use 24 | **/ 25 | define('PROTOCOL','http'); 26 | 27 | /** 28 | * Enviroment specific to internal framework use. 29 | * 30 | * Examples; 31 | * 32 | * The framework use this constant for check if an error occurred, show another 33 | * view and HTTP status code error 34 | **/ 35 | define('ENVIROMENT','dev'); 36 | 37 | /** 38 | * Load the main framework parts 39 | **/ 40 | 41 | require_once(__ROOT__DIR__ . 'system/Controller.php'); 42 | require_once(__ROOT__DIR__ . 'system/core/Router.php'); 43 | require_once(__ROOT__DIR__ . 'system/core/Request.php'); 44 | require_once(__ROOT__DIR__ . 'system/core/Dispatcher.php'); 45 | require_once(__ROOT__DIR__ . 'system/Assets.php'); 46 | 47 | use Ligne\ErrorHandler; 48 | 49 | new ErrorHandler(ENVIROMENT); 50 | 51 | //Env file load if exists 52 | if(file_exists(__ROOT__DIR__.'.env')){ 53 | $dotenv = Dotenv\Dotenv::createImmutable(__ROOT__DIR__); 54 | $dotenv->load(); 55 | } 56 | 57 | //Load app 58 | $dispatch = new Dispatcher(); 59 | $dispatch->dispatch(); 60 | -------------------------------------------------------------------------------- /system/core/Dispatcher.php: -------------------------------------------------------------------------------- 1 | request = new Request(); 19 | Router::parse($this->request->url, $this->request); 20 | $name = ucfirst($this->request->controller) . "Controller"; 21 | $file = __ROOT__DIR__ . 'src/controllers/' . $name . '.php'; 22 | 23 | if($this->isControllerFileExtis($file)){ 24 | $controller = $this->getController($name,$file); 25 | $this->isEmptyAction($this->request->action); 26 | 27 | if(method_exists($controller, $this->request->action)){ 28 | call_user_func_array([$controller, $this->request->action], $this->request->params); 29 | }else{ 30 | Router::showActionNoExists($this->request->action); 31 | } 32 | }else{ 33 | Router::showNonexistentController($this->request->controller); 34 | } 35 | } 36 | 37 | /** 38 | * Loads a driver based on the requested URL 39 | * @return mixed 40 | */ 41 | public function getController(string $name, string $file):object 42 | { 43 | require($file); 44 | $controller = new $name(); 45 | return $controller; 46 | } 47 | 48 | private function isControllerFileExtis(string $file):bool{ 49 | if(file_exists($file)) 50 | return true; 51 | else 52 | return false; 53 | } 54 | 55 | /** 56 | * It is used to know if the variable that contains the action 57 | * This empty, if empty, no valid action has been entered 58 | * or controller method 59 | * @param $ action [Controller method] 60 | * 61 | * @return bool 62 | */ 63 | public function isEmptyAction(string $action):void{ 64 | if(empty($action)){ 65 | Router::showInvalidAction(); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /system/Assets.php: -------------------------------------------------------------------------------- 1 | "> 64 | * ^ ^ 65 | * controller ^ 66 | * action 67 | * 68 | * @param $url [users/profile] 69 | * @param $param | mixed [ '1' or array [1 , "services", 2] ] 70 | * 71 | * @return string 72 | */ 73 | static public function href(string $url, $param = null):string { 74 | $new_url = explode('/',$url); 75 | $root_dir = explode('/',$_SERVER['REQUEST_URI']); 76 | $param = ($param == null)? '' : self::params($param) ; 77 | if(count($new_url) > 1){ 78 | return '/' . $root_dir[1] . '/' . trim($new_url[0]) . '/' . trim($new_url[1]) . $param ; 79 | }else{ 80 | return '/' . $root_dir[1] . '/' . 'novalid/url'; 81 | } 82 | } 83 | 84 | static private function params($params):string { 85 | if(is_array($params)){ 86 | $all_params = null; 87 | foreach ($params as $key => $value) { 88 | $all_params = $all_params . '/' . $value; 89 | } 90 | return $all_params; 91 | }else{ 92 | $param = '/' . trim($params) ; 93 | return $param; 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/views/default/index.php: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 5 |
6 |
7 | launch icon 8 |
9 |

10 |
11 |

Version:

12 |
13 |
14 |

Environment:

15 |
16 |
17 |

Date:

18 |
19 |
20 |

Required dependencies:

21 | 26 |
27 |
28 | Autor: 29 | https://github.com/itsalb3rt 30 |
31 |
32 | -------------------------------------------------------------------------------- /system/Controller.php: -------------------------------------------------------------------------------- 1 | vars = array_merge($this->vars, $data); 37 | } 38 | 39 | /** 40 | * Load your view file and pass all data you pass in setData method 41 | * 42 | * @param string $filename | You view file name, in general this have same name of the action or other name in view dir controller learn more https://ligne-framework.gitbook.io/ligne-framework-php/documentacion/controlador 43 | * @param string $title | Title page you want display to user 44 | * @param bool $external_view | Use for specific another view is you want not load the default controller view 45 | * @param string $other_layout | If you want specific other layout to render your view 46 | */ 47 | function render(string $filename,string $title = null,bool $external_view = false,string $other_layout = null):void 48 | { 49 | extract($this->vars,EXTR_OVERWRITE); 50 | ob_start(); 51 | if($external_view){ 52 | $view_file = __ROOT__DIR__ . "src/views/" . $filename . '.php'; 53 | }else{ 54 | $view_file = __ROOT__DIR__ . "src/views/" . strtolower(str_replace('Controller', '', get_class($this))) . '/' . $filename . '.php'; 55 | } 56 | 57 | if(file_exists($view_file)) 58 | require($view_file); 59 | else 60 | $this->viewNonexists($filename); 61 | 62 | $this->pageTitle = $title; 63 | $this->layout = ($other_layout != null)? $other_layout : $this->layout; 64 | http_response_code(200); 65 | $this->renderLayout(ob_get_clean()); 66 | } 67 | 68 | 69 | /** 70 | * @param $content_for_layout 71 | */ 72 | private function renderLayout(string $viewContent):void{ 73 | //The pageTitle var create here for scope visibility 74 | $pageTitle = ($this->pageTitle != null)? $this->pageTitle : null ; 75 | if(file_exists(__ROOT__DIR__ . "template/" . $this->layout . '.php')){ 76 | require(__ROOT__DIR__ . "template/" . $this->layout . '.php'); 77 | }else { 78 | $this->defaultLayoutNotFound(); 79 | } 80 | } 81 | 82 | /** 83 | * Redirect user to internal route in project or external route 84 | * 85 | * array ( 'controller' => 'myController' , 'action' => 'foo' , [2]) 86 | * Or internet route 'https://google.com' 87 | * 88 | * @param $redirecTo 89 | * @param null $param 90 | */ 91 | function redirect($redirecTo,$param = null) :void { 92 | if(is_array($redirecTo)) { 93 | $root_dir = $_SERVER['REQUEST_URI']; 94 | $root_dir = explode('/',$root_dir); 95 | $param_ = ($param == null )? '' : '/' . $param; 96 | header('Location: '. '/' . $root_dir[1] . '/' . $redirecTo['controller'] . '/' . $redirecTo['action'] . $param_ ); 97 | }else 98 | header('Location: '.$redirecTo); 99 | } 100 | 101 | /** 102 | * Show error 500 HTTP status if the view you specific in your controller 103 | * @param $filename 104 | */ 105 | private function viewNonexists(string $filename):void{ 106 | $errorHandler = new ErrorHandler(ENVIROMENT); 107 | $errorHandler->showDevMessages("View not found", 108 | "' $filename ' view not found"); 109 | } 110 | /** 111 | * Is the default layout no exits 112 | **/ 113 | private function defaultLayoutNotFound():void { 114 | $errorHandler = new ErrorHandler(ENVIROMENT); 115 | $errorHandler->showDevMessages("Problem loading the default layout", 116 | "The default layout could not be loaded, probably it is not with the name that has been configured or does not exist.", 117 | __ROOT__DIR__ . "views/template/" . $this->layout . '.php'); 118 | } 119 | 120 | } 121 | -------------------------------------------------------------------------------- /system/core/Router.php: -------------------------------------------------------------------------------- 1 | controller = $controllerName; 57 | $request->action = $actionName; 58 | $request->params = $params; 59 | } 60 | 61 | /** 62 | * The default root project controller 63 | * 64 | * http://localhost/project/ 65 | * 66 | * @param $request 67 | */ 68 | static public function loadIndex(object $request): void 69 | { 70 | $request->controller = "default"; 71 | $request->action = "index"; 72 | $request->params = []; 73 | } 74 | 75 | /** 76 | * Check if the url have an controller and action 77 | * eje: http://localhost/ligne_php/Controller/Action/[parameter] 78 | * ^ ^ 79 | * $url[0] $url[1] 80 | * @param $url Array 81 | * 82 | * @return bool 83 | */ 84 | static private function isArrayUrlValid(array $url): bool 85 | { 86 | if (count($url) > 1) 87 | return true; 88 | else 89 | return false; 90 | } 91 | 92 | /** 93 | * Return main project dir for load controllers class files 94 | * 95 | * @return string 96 | */ 97 | static private function rootDir(): string 98 | { 99 | $root_dir = str_replace('/system/core', '', __DIR__); 100 | $root_dir = explode('/', $root_dir); 101 | return $root_dir[count($root_dir) - 1]; 102 | } 103 | 104 | /** 105 | * When the user insert a invalid controller this show a 500 HTTP Status error 106 | */ 107 | static public function showNonexistentController(string $controller_name = null): void 108 | { 109 | $erroHandler = new ErrorHandler(ENVIROMENT); 110 | $erroHandler->showDevMessages("Controller name does not exist", 111 | "Actually has a controller named $controller_name", $_SERVER['REQUEST_URI']); 112 | } 113 | 114 | /** 115 | * Show HTTP 500 Status code and error if the actions not valid 116 | */ 117 | static public function showInvalidAction(): void 118 | { 119 | $erroHandler = new ErrorHandler(ENVIROMENT); 120 | $erroHandler->showDevMessages("Non-existent action for the url", 121 | "You may be trying to perform an action that does not exist, for example for a foo controller that has a bar action the path would be http://domain/foo/bar", 122 | $_SERVER['REQUEST_URI']); 123 | } 124 | 125 | /** 126 | * Show HTTP 500 Status code and error if the actions not exists 127 | * @param $method String 128 | */ 129 | static public function showActionNoExists(string $method): void 130 | { 131 | $erroHandler = new ErrorHandler(ENVIROMENT); 132 | $erroHandler->showDevMessages("The action ' " . $method . " ' Does not exist", 133 | "The requested action does not appear to exist in the controller"); 134 | } 135 | 136 | /** 137 | * @param $url 138 | * @return mixed 139 | * 140 | * Subtract the controller name of the url using a root dir for 141 | * get relative url 142 | */ 143 | static public function subtractControllerName($url) 144 | { 145 | $explodeUrl = explode('/', $url); 146 | $explodeRootDir = explode('/', __ROOT__DIR__); 147 | 148 | $explodeUrl = self::unsertKeysFromSourceArray($explodeUrl, $explodeRootDir); 149 | 150 | $explodeUrl = array_values($explodeUrl); 151 | return isset($explodeUrl[0]) ? $explodeUrl[0] : null; 152 | } 153 | 154 | static public function subtractActionName($url) 155 | { 156 | $explodeUrl = explode('/', $url); 157 | $explodeRootDir = explode('/', __ROOT__DIR__); 158 | 159 | $explodeUrl = self::unsertKeysFromSourceArray($explodeUrl, $explodeRootDir); 160 | 161 | $explodeUrl = array_values($explodeUrl); 162 | return isset($explodeUrl[1]) ? $explodeUrl[1] : null; 163 | } 164 | 165 | static public function subtractParams($url): array 166 | { 167 | $explodeUrl = explode('/', $url); 168 | $explodeRootDir = explode('/', __ROOT__DIR__); 169 | 170 | $params = self::unsertKeysFromSourceArray($explodeUrl, $explodeRootDir); 171 | 172 | $params = array_values($explodeUrl); 173 | //Exclude the controller and action from url 174 | for ($i = 0; $i <= 3; $i++) 175 | unset($params[$i]); 176 | $params = array_values($params); 177 | return (empty($params)) ? [] : $params; 178 | } 179 | 180 | /** 181 | * @param array $source 182 | * @param array $target 183 | * @return array 184 | * 185 | * Use for get the controller, action and paras from url 186 | * this recibe a $source (explode URL user request) and $target (explode root dir project) 187 | * 188 | * Unsert project "values" from the $url for determinate if the user specific the 189 | * controller, action and params 190 | */ 191 | static private function unsertKeysFromSourceArray(array $source, array $target) 192 | { 193 | foreach ($source as $key => $value) { 194 | if (in_array($value, $target)) { 195 | unset($source[$key]); 196 | } 197 | } 198 | return $source; 199 | } 200 | } 201 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "0c082e34e959b91567d4fba71cab26a8", 8 | "packages": [ 9 | { 10 | "name": "graham-campbell/result-type", 11 | "version": "v1.0.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/GrahamCampbell/Result-Type.git", 15 | "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/7e279d2cd5d7fbb156ce46daada972355cea27bb", 20 | "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "^7.0|^8.0", 25 | "phpoption/phpoption": "^1.7.3" 26 | }, 27 | "require-dev": { 28 | "phpunit/phpunit": "^6.5|^7.5|^8.5|^9.0" 29 | }, 30 | "type": "library", 31 | "extra": { 32 | "branch-alias": { 33 | "dev-master": "1.0-dev" 34 | } 35 | }, 36 | "autoload": { 37 | "psr-4": { 38 | "GrahamCampbell\\ResultType\\": "src/" 39 | } 40 | }, 41 | "notification-url": "https://packagist.org/downloads/", 42 | "license": [ 43 | "MIT" 44 | ], 45 | "authors": [ 46 | { 47 | "name": "Graham Campbell", 48 | "email": "graham@alt-three.com" 49 | } 50 | ], 51 | "description": "An Implementation Of The Result Type", 52 | "keywords": [ 53 | "Graham Campbell", 54 | "GrahamCampbell", 55 | "Result Type", 56 | "Result-Type", 57 | "result" 58 | ], 59 | "time": "2020-04-13T13:17:36+00:00" 60 | }, 61 | { 62 | "name": "izniburak/pdox", 63 | "version": "v1.3.5", 64 | "source": { 65 | "type": "git", 66 | "url": "https://github.com/izniburak/pdox.git", 67 | "reference": "8f3f095c934b1a84b360b6912936f267c8904f83" 68 | }, 69 | "dist": { 70 | "type": "zip", 71 | "url": "https://api.github.com/repos/izniburak/pdox/zipball/8f3f095c934b1a84b360b6912936f267c8904f83", 72 | "reference": "8f3f095c934b1a84b360b6912936f267c8904f83", 73 | "shasum": "" 74 | }, 75 | "require": { 76 | "ext-pdo": "*", 77 | "php": ">=5.4.0" 78 | }, 79 | "type": "library", 80 | "autoload": { 81 | "psr-4": { 82 | "Buki\\": "src" 83 | } 84 | }, 85 | "notification-url": "https://packagist.org/downloads/", 86 | "license": [ 87 | "MIT" 88 | ], 89 | "authors": [ 90 | { 91 | "name": "İzni Burak Demirtaş", 92 | "email": "info@burakdemirtas.org", 93 | "homepage": "http://burakdemirtas.org" 94 | } 95 | ], 96 | "description": "Useful Query Builder, PDO Class for PHP. A simple access to your SQL records.", 97 | "homepage": "https://github.com/izniburak/PDOx", 98 | "keywords": [ 99 | "builder", 100 | "pdo", 101 | "php", 102 | "query", 103 | "sql" 104 | ], 105 | "time": "2018-12-23T18:03:46+00:00" 106 | }, 107 | { 108 | "name": "ligne/error-handler", 109 | "version": "1.1", 110 | "source": { 111 | "type": "git", 112 | "url": "https://github.com/lignedev/error-handler.git", 113 | "reference": "703354a1bb72687028fee04526b73a172c193618" 114 | }, 115 | "dist": { 116 | "type": "zip", 117 | "url": "https://api.github.com/repos/lignedev/error-handler/zipball/703354a1bb72687028fee04526b73a172c193618", 118 | "reference": "703354a1bb72687028fee04526b73a172c193618", 119 | "shasum": "" 120 | }, 121 | "require": { 122 | "php": ">=7.1" 123 | }, 124 | "type": "library", 125 | "autoload": { 126 | "psr-4": { 127 | "Ligne\\": "src" 128 | } 129 | }, 130 | "notification-url": "https://packagist.org/downloads/", 131 | "license": [ 132 | "MIT" 133 | ], 134 | "authors": [ 135 | { 136 | "name": "Albert Eduardo Hidalgo Taveras", 137 | "email": "itsalb3rt@gmail.com", 138 | "role": "Developer" 139 | } 140 | ], 141 | "description": "Error Handler for Ligne PHP", 142 | "homepage": "https://github.com/lignedev/error-handler", 143 | "keywords": [ 144 | "error handler", 145 | "ligne php" 146 | ], 147 | "time": "2020-06-06T15:04:16+00:00" 148 | }, 149 | { 150 | "name": "phpoption/phpoption", 151 | "version": "1.7.4", 152 | "source": { 153 | "type": "git", 154 | "url": "https://github.com/schmittjoh/php-option.git", 155 | "reference": "b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3" 156 | }, 157 | "dist": { 158 | "type": "zip", 159 | "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3", 160 | "reference": "b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3", 161 | "shasum": "" 162 | }, 163 | "require": { 164 | "php": "^5.5.9 || ^7.0 || ^8.0" 165 | }, 166 | "require-dev": { 167 | "bamarni/composer-bin-plugin": "^1.3", 168 | "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" 169 | }, 170 | "type": "library", 171 | "extra": { 172 | "branch-alias": { 173 | "dev-master": "1.7-dev" 174 | } 175 | }, 176 | "autoload": { 177 | "psr-4": { 178 | "PhpOption\\": "src/PhpOption/" 179 | } 180 | }, 181 | "notification-url": "https://packagist.org/downloads/", 182 | "license": [ 183 | "Apache-2.0" 184 | ], 185 | "authors": [ 186 | { 187 | "name": "Johannes M. Schmitt", 188 | "email": "schmittjoh@gmail.com" 189 | }, 190 | { 191 | "name": "Graham Campbell", 192 | "email": "graham@alt-three.com" 193 | } 194 | ], 195 | "description": "Option Type for PHP", 196 | "keywords": [ 197 | "language", 198 | "option", 199 | "php", 200 | "type" 201 | ], 202 | "time": "2020-06-07T10:40:07+00:00" 203 | }, 204 | { 205 | "name": "symfony/polyfill-ctype", 206 | "version": "v1.17.0", 207 | "source": { 208 | "type": "git", 209 | "url": "https://github.com/symfony/polyfill-ctype.git", 210 | "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9" 211 | }, 212 | "dist": { 213 | "type": "zip", 214 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9", 215 | "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9", 216 | "shasum": "" 217 | }, 218 | "require": { 219 | "php": ">=5.3.3" 220 | }, 221 | "suggest": { 222 | "ext-ctype": "For best performance" 223 | }, 224 | "type": "library", 225 | "extra": { 226 | "branch-alias": { 227 | "dev-master": "1.17-dev" 228 | } 229 | }, 230 | "autoload": { 231 | "psr-4": { 232 | "Symfony\\Polyfill\\Ctype\\": "" 233 | }, 234 | "files": [ 235 | "bootstrap.php" 236 | ] 237 | }, 238 | "notification-url": "https://packagist.org/downloads/", 239 | "license": [ 240 | "MIT" 241 | ], 242 | "authors": [ 243 | { 244 | "name": "Gert de Pagter", 245 | "email": "BackEndTea@gmail.com" 246 | }, 247 | { 248 | "name": "Symfony Community", 249 | "homepage": "https://symfony.com/contributors" 250 | } 251 | ], 252 | "description": "Symfony polyfill for ctype functions", 253 | "homepage": "https://symfony.com", 254 | "keywords": [ 255 | "compatibility", 256 | "ctype", 257 | "polyfill", 258 | "portable" 259 | ], 260 | "time": "2020-05-12T16:14:59+00:00" 261 | }, 262 | { 263 | "name": "symfony/polyfill-mbstring", 264 | "version": "v1.17.0", 265 | "source": { 266 | "type": "git", 267 | "url": "https://github.com/symfony/polyfill-mbstring.git", 268 | "reference": "fa79b11539418b02fc5e1897267673ba2c19419c" 269 | }, 270 | "dist": { 271 | "type": "zip", 272 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c", 273 | "reference": "fa79b11539418b02fc5e1897267673ba2c19419c", 274 | "shasum": "" 275 | }, 276 | "require": { 277 | "php": ">=5.3.3" 278 | }, 279 | "suggest": { 280 | "ext-mbstring": "For best performance" 281 | }, 282 | "type": "library", 283 | "extra": { 284 | "branch-alias": { 285 | "dev-master": "1.17-dev" 286 | } 287 | }, 288 | "autoload": { 289 | "psr-4": { 290 | "Symfony\\Polyfill\\Mbstring\\": "" 291 | }, 292 | "files": [ 293 | "bootstrap.php" 294 | ] 295 | }, 296 | "notification-url": "https://packagist.org/downloads/", 297 | "license": [ 298 | "MIT" 299 | ], 300 | "authors": [ 301 | { 302 | "name": "Nicolas Grekas", 303 | "email": "p@tchwork.com" 304 | }, 305 | { 306 | "name": "Symfony Community", 307 | "homepage": "https://symfony.com/contributors" 308 | } 309 | ], 310 | "description": "Symfony polyfill for the Mbstring extension", 311 | "homepage": "https://symfony.com", 312 | "keywords": [ 313 | "compatibility", 314 | "mbstring", 315 | "polyfill", 316 | "portable", 317 | "shim" 318 | ], 319 | "time": "2020-05-12T16:47:27+00:00" 320 | }, 321 | { 322 | "name": "symfony/polyfill-php80", 323 | "version": "v1.17.0", 324 | "source": { 325 | "type": "git", 326 | "url": "https://github.com/symfony/polyfill-php80.git", 327 | "reference": "5e30b2799bc1ad68f7feb62b60a73743589438dd" 328 | }, 329 | "dist": { 330 | "type": "zip", 331 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/5e30b2799bc1ad68f7feb62b60a73743589438dd", 332 | "reference": "5e30b2799bc1ad68f7feb62b60a73743589438dd", 333 | "shasum": "" 334 | }, 335 | "require": { 336 | "php": ">=7.0.8" 337 | }, 338 | "type": "library", 339 | "extra": { 340 | "branch-alias": { 341 | "dev-master": "1.17-dev" 342 | } 343 | }, 344 | "autoload": { 345 | "psr-4": { 346 | "Symfony\\Polyfill\\Php80\\": "" 347 | }, 348 | "files": [ 349 | "bootstrap.php" 350 | ], 351 | "classmap": [ 352 | "Resources/stubs" 353 | ] 354 | }, 355 | "notification-url": "https://packagist.org/downloads/", 356 | "license": [ 357 | "MIT" 358 | ], 359 | "authors": [ 360 | { 361 | "name": "Ion Bazan", 362 | "email": "ion.bazan@gmail.com" 363 | }, 364 | { 365 | "name": "Nicolas Grekas", 366 | "email": "p@tchwork.com" 367 | }, 368 | { 369 | "name": "Symfony Community", 370 | "homepage": "https://symfony.com/contributors" 371 | } 372 | ], 373 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 374 | "homepage": "https://symfony.com", 375 | "keywords": [ 376 | "compatibility", 377 | "polyfill", 378 | "portable", 379 | "shim" 380 | ], 381 | "time": "2020-05-12T16:47:27+00:00" 382 | }, 383 | { 384 | "name": "vlucas/phpdotenv", 385 | "version": "v5.0.0", 386 | "source": { 387 | "type": "git", 388 | "url": "https://github.com/vlucas/phpdotenv.git", 389 | "reference": "fbb6a5f65512f21d0db9e21bd49e67f70a9bbd5e" 390 | }, 391 | "dist": { 392 | "type": "zip", 393 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/fbb6a5f65512f21d0db9e21bd49e67f70a9bbd5e", 394 | "reference": "fbb6a5f65512f21d0db9e21bd49e67f70a9bbd5e", 395 | "shasum": "" 396 | }, 397 | "require": { 398 | "ext-pcre": "*", 399 | "graham-campbell/result-type": "^1.0.1", 400 | "php": "^7.1.3 || ^8.0", 401 | "phpoption/phpoption": "^1.7.4", 402 | "symfony/polyfill-ctype": "^1.17", 403 | "symfony/polyfill-mbstring": "^1.17", 404 | "symfony/polyfill-php80": "^1.17" 405 | }, 406 | "require-dev": { 407 | "bamarni/composer-bin-plugin": "^1.4.1", 408 | "ext-filter": "*", 409 | "phpunit/phpunit": "^7.5.20 || ^8.5.2 || ^9.0" 410 | }, 411 | "suggest": { 412 | "ext-filter": "Required to use the boolean validator." 413 | }, 414 | "type": "library", 415 | "extra": { 416 | "branch-alias": { 417 | "dev-master": "5.0-dev" 418 | } 419 | }, 420 | "autoload": { 421 | "psr-4": { 422 | "Dotenv\\": "src/" 423 | } 424 | }, 425 | "notification-url": "https://packagist.org/downloads/", 426 | "license": [ 427 | "BSD-3-Clause" 428 | ], 429 | "authors": [ 430 | { 431 | "name": "Graham Campbell", 432 | "email": "graham@alt-three.com", 433 | "homepage": "https://gjcampbell.co.uk/" 434 | }, 435 | { 436 | "name": "Vance Lucas", 437 | "email": "vance@vancelucas.com", 438 | "homepage": "https://vancelucas.com/" 439 | } 440 | ], 441 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 442 | "keywords": [ 443 | "dotenv", 444 | "env", 445 | "environment" 446 | ], 447 | "time": "2020-06-07T19:04:14+00:00" 448 | } 449 | ], 450 | "packages-dev": [], 451 | "aliases": [], 452 | "minimum-stability": "stable", 453 | "stability-flags": [], 454 | "prefer-stable": false, 455 | "prefer-lowest": false, 456 | "platform": [], 457 | "platform-dev": [] 458 | } 459 | --------------------------------------------------------------------------------