├── 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 | =
14 | /**
15 | * By default all the views render in this layout, please don't touch this part if you dont know you doing
16 | **/
17 | $viewContent;
18 | ?>
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 | 
22 |
23 |
24 | ## Rutas
25 | Vista rapida de una **url** con el framework
26 |
27 | 
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 |
6 |
7 |
 ?>)
8 |
9 |
= $framework_name ?>
10 |
11 |
Version: = $version ?>
12 |
13 |
14 |
Environment: = $environment ?>
15 |
16 |
17 |
Date: = $date ?>
18 |
19 |
20 |
Required dependencies:
21 |
22 |
23 | - = $value ?>
24 |
25 |
26 |
27 |
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 |
--------------------------------------------------------------------------------