├── .DS_Store ├── README.md ├── app ├── .DS_Store ├── controllers │ ├── PagesController.php │ └── TasksController.php ├── models │ └── Task.php ├── routes.php └── views │ ├── about.view.php │ ├── contact.view.php │ ├── index.view.php │ └── partials │ ├── footer.php │ ├── head.php │ └── nav.php ├── composer.json ├── config.php ├── core ├── .DS_Store ├── App.php ├── Request.php ├── Router.php ├── bootstrap.php ├── database │ ├── Connection.php │ └── QueryBuilder.php └── helpers.php ├── index.php ├── public ├── .DS_Store └── css │ └── style.css └── vendor ├── autoload.php └── composer ├── ClassLoader.php ├── LICENSE ├── autoload_classmap.php ├── autoload_files.php ├── autoload_namespaces.php ├── autoload_psr4.php ├── autoload_real.php ├── autoload_static.php └── installed.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhoujiping/build-your-own-php-framework/ba5c849414471f51bcb184c8cecef3ff2805b472/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 论PHP框架是如何诞生的代码 2 | 3 | 文章地址: http://www.zhoujiping.com/php/build-your-own-php-framework/ 4 | 5 | ## 分支说明及文章对应代码阅读说明 6 | 7 | 一共有5个分支: 8 | 9 | ```bash 10 | 11 | `the_first_refactoring` - 对应文章中目录: 第一次代码重构 12 | `the_second_refactoring` - 对应文章中目录: 第二次代码重构 13 | `the_third_refactoring` - 对应文章中目录: 第三次代码重构 14 | `the_fourth_refactoring` - 对应文章中目录: 第四次代码重构 15 | `master` - 最后完成的代码 16 | ``` 17 | 18 | ## 查阅和切换分支 19 | 20 | ```bash 21 | # 复制代码 22 | git clone https://github.com/zhoujiping/build-your-own-php-framework.git 23 | 24 | # 切换分支 25 | git checkout the_first_refactoring 26 | ``` 27 | 28 | ## 先创建数据库 29 | 30 | 使用 Mysql 数据库,创建名为 `todolist` 的数据库,数据库中只有一个表`tasks`, 字段如下: 31 | 32 | ```bash 33 | 34 | +-------------+------------------+------+-----+---------+----------------+ 35 | | Field | Type | Null | Key | Default | Extra | 36 | +-------------+------------------+------+-----+---------+----------------+ 37 | | id | int(11) unsigned | NO | PRI | NULL | auto_increment | 38 | | description | text | NO | | NULL | | 39 | | completed | tinyint(1) | NO | | NULL | | 40 | +-------------+------------------+------+-----+---------+----------------+ 41 | ``` 42 | 43 | ## config.php 中的配置 44 | 45 | ```php 46 | 47 | return [ 48 | 'database' => [ 49 | 'name' => 'todolist', // 数据库名 50 | 'username' => 'root', // Mysql 登录用户名 51 | 'password' => 'password', // Mysql 登录密码 52 | 'connection' => 'mysql:host=127.0.0.1', 53 | 'options' => [ 54 | PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 55 | ] 56 | ] 57 | ]; 58 | ``` 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /app/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhoujiping/build-your-own-php-framework/ba5c849414471f51bcb184c8cecef3ff2805b472/app/.DS_Store -------------------------------------------------------------------------------- /app/controllers/PagesController.php: -------------------------------------------------------------------------------- 1 | selectAll('tasks', 'Task'); 12 | 13 | return view('index', compact('tasks')); 14 | } 15 | 16 | public function store() 17 | { 18 | App::get('database')->create('tasks', [ 19 | 'description' => $_POST['description'], 20 | 'completed' => 0 21 | ]); 22 | 23 | return redirect(); 24 | } 25 | } -------------------------------------------------------------------------------- /app/models/Task.php: -------------------------------------------------------------------------------- 1 | completed; 17 | } 18 | 19 | // 设置任务已完成 20 | public function complete() 21 | { 22 | $this->completed = true; 23 | } 24 | } -------------------------------------------------------------------------------- /app/routes.php: -------------------------------------------------------------------------------- 1 | get('about', 'PagesController@about'); 4 | $router->get('contact', 'PagesController@contact'); 5 | 6 | $router->get('', 'TasksController@index'); 7 | $router->post('tasks', 'TasksController@store'); -------------------------------------------------------------------------------- /app/views/about.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

About Page

5 | 6 | -------------------------------------------------------------------------------- /app/views/contact.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Contact Page

5 | 6 | -------------------------------------------------------------------------------- /app/views/index.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

My TodoList

5 | 6 | 17 | 18 |
19 | 20 | 21 |
22 | 23 | -------------------------------------------------------------------------------- /app/views/partials/footer.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/views/partials/head.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | title 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/views/partials/nav.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "autoload": { 3 | "classmap": [ 4 | "./" 5 | ], 6 | "files": [ 7 | "core/helpers.php" 8 | ] 9 | } 10 | } -------------------------------------------------------------------------------- /config.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => 'todolist', 6 | 'username' => 'root', 7 | 'password' => 'longzu2016!@#', 8 | 'connection' => 'mysql:host=127.0.0.1', 9 | 'options' => [ 10 | PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 11 | ] 12 | ] 13 | ]; -------------------------------------------------------------------------------- /core/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhoujiping/build-your-own-php-framework/ba5c849414471f51bcb184c8cecef3ff2805b472/core/.DS_Store -------------------------------------------------------------------------------- /core/App.php: -------------------------------------------------------------------------------- 1 | [], 9 | 'POST' => [] 10 | ]; 11 | 12 | public static function load($file) 13 | { 14 | $router = new static; 15 | 16 | require $file; 17 | 18 | return $router; 19 | } 20 | 21 | public function get($uri, $controller) 22 | { 23 | $this->routes['GET'][$uri] = $controller; 24 | } 25 | 26 | public function post($uri, $controller) 27 | { 28 | $this->routes['POST'][$uri] = $controller; 29 | } 30 | 31 | public function direct($uri, $requestType) 32 | { 33 | if (array_key_exists($uri, $this->routes[$requestType])) { 34 | return $this->callAction( 35 | ...explode('@', $this->routes[$requestType][$uri]) 36 | ); 37 | } 38 | 39 | throw new Exception('No route defined for this URI'); 40 | } 41 | 42 | private function callAction($controller, $action) 43 | { 44 | $controller = "App\\Controllers\\{$controller}"; 45 | 46 | $controllerObj = new $controller; 47 | 48 | if (! method_exists($controllerObj, $action)) { 49 | throw new Exception( 50 | "{$controller} does not respond to the {$action} action." 51 | ); 52 | } 53 | 54 | return $controllerObj->$action(); 55 | } 56 | } -------------------------------------------------------------------------------- /core/bootstrap.php: -------------------------------------------------------------------------------- 1 | getMessage()); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /core/database/QueryBuilder.php: -------------------------------------------------------------------------------- 1 | pdo = $pdo; 14 | } 15 | 16 | public function selectAll($table, $className) 17 | { 18 | $statement = $this->pdo->prepare("select * from {$table}"); 19 | 20 | $statement->execute(); 21 | 22 | return $statement->fetchAll(PDO::FETCH_CLASS, "App\\Models\\{$className}"); 23 | } 24 | 25 | public function create($table, $parameters) 26 | { 27 | $sql = sprintf( 28 | 'insert into %s (%s) values (%s)', 29 | $table, 30 | implode(', ', array_keys($parameters)), 31 | ':' . implode(', :',array_keys($parameters)) 32 | ); 33 | 34 | try { 35 | $statement = $this->pdo->prepare($sql); 36 | $statement->execute($parameters); 37 | } catch (PDOException $e) { 38 | die($e->getMessage()); } 39 | } 40 | } -------------------------------------------------------------------------------- /core/helpers.php: -------------------------------------------------------------------------------- 1 | direct(Request::uri(), Request::method()); -------------------------------------------------------------------------------- /public/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhoujiping/build-your-own-php-framework/ba5c849414471f51bcb184c8cecef3ff2805b472/public/.DS_Store -------------------------------------------------------------------------------- /public/css/style.css: -------------------------------------------------------------------------------- 1 | nav>ul>li { 2 | display: inline-block; 3 | padding: 5px; 4 | } 5 | 6 | ul { 7 | padding-left: 0; 8 | } 9 | 10 | textarea { 11 | display: block; 12 | } 13 | 14 | button { 15 | padding: 5px; 16 | margin-top: 10px; 17 | cursor: pointer; 18 | } -------------------------------------------------------------------------------- /vendor/autoload.php: -------------------------------------------------------------------------------- 1 | 7 | * Jordi Boggiano 8 | * 9 | * For the full copyright and license information, please view the LICENSE 10 | * file that was distributed with this source code. 11 | */ 12 | 13 | namespace Composer\Autoload; 14 | 15 | /** 16 | * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. 17 | * 18 | * $loader = new \Composer\Autoload\ClassLoader(); 19 | * 20 | * // register classes with namespaces 21 | * $loader->add('Symfony\Component', __DIR__.'/component'); 22 | * $loader->add('Symfony', __DIR__.'/framework'); 23 | * 24 | * // activate the autoloader 25 | * $loader->register(); 26 | * 27 | * // to enable searching the include path (eg. for PEAR packages) 28 | * $loader->setUseIncludePath(true); 29 | * 30 | * In this example, if you try to use a class in the Symfony\Component 31 | * namespace or one of its children (Symfony\Component\Console for instance), 32 | * the autoloader will first look for the class under the component/ 33 | * directory, and it will then fallback to the framework/ directory if not 34 | * found before giving up. 35 | * 36 | * This class is loosely based on the Symfony UniversalClassLoader. 37 | * 38 | * @author Fabien Potencier 39 | * @author Jordi Boggiano 40 | * @see http://www.php-fig.org/psr/psr-0/ 41 | * @see http://www.php-fig.org/psr/psr-4/ 42 | */ 43 | class ClassLoader 44 | { 45 | // PSR-4 46 | private $prefixLengthsPsr4 = array(); 47 | private $prefixDirsPsr4 = array(); 48 | private $fallbackDirsPsr4 = array(); 49 | 50 | // PSR-0 51 | private $prefixesPsr0 = array(); 52 | private $fallbackDirsPsr0 = array(); 53 | 54 | private $useIncludePath = false; 55 | private $classMap = array(); 56 | private $classMapAuthoritative = false; 57 | private $missingClasses = array(); 58 | private $apcuPrefix; 59 | 60 | public function getPrefixes() 61 | { 62 | if (!empty($this->prefixesPsr0)) { 63 | return call_user_func_array('array_merge', $this->prefixesPsr0); 64 | } 65 | 66 | return array(); 67 | } 68 | 69 | public function getPrefixesPsr4() 70 | { 71 | return $this->prefixDirsPsr4; 72 | } 73 | 74 | public function getFallbackDirs() 75 | { 76 | return $this->fallbackDirsPsr0; 77 | } 78 | 79 | public function getFallbackDirsPsr4() 80 | { 81 | return $this->fallbackDirsPsr4; 82 | } 83 | 84 | public function getClassMap() 85 | { 86 | return $this->classMap; 87 | } 88 | 89 | /** 90 | * @param array $classMap Class to filename map 91 | */ 92 | public function addClassMap(array $classMap) 93 | { 94 | if ($this->classMap) { 95 | $this->classMap = array_merge($this->classMap, $classMap); 96 | } else { 97 | $this->classMap = $classMap; 98 | } 99 | } 100 | 101 | /** 102 | * Registers a set of PSR-0 directories for a given prefix, either 103 | * appending or prepending to the ones previously set for this prefix. 104 | * 105 | * @param string $prefix The prefix 106 | * @param array|string $paths The PSR-0 root directories 107 | * @param bool $prepend Whether to prepend the directories 108 | */ 109 | public function add($prefix, $paths, $prepend = false) 110 | { 111 | if (!$prefix) { 112 | if ($prepend) { 113 | $this->fallbackDirsPsr0 = array_merge( 114 | (array) $paths, 115 | $this->fallbackDirsPsr0 116 | ); 117 | } else { 118 | $this->fallbackDirsPsr0 = array_merge( 119 | $this->fallbackDirsPsr0, 120 | (array) $paths 121 | ); 122 | } 123 | 124 | return; 125 | } 126 | 127 | $first = $prefix[0]; 128 | if (!isset($this->prefixesPsr0[$first][$prefix])) { 129 | $this->prefixesPsr0[$first][$prefix] = (array) $paths; 130 | 131 | return; 132 | } 133 | if ($prepend) { 134 | $this->prefixesPsr0[$first][$prefix] = array_merge( 135 | (array) $paths, 136 | $this->prefixesPsr0[$first][$prefix] 137 | ); 138 | } else { 139 | $this->prefixesPsr0[$first][$prefix] = array_merge( 140 | $this->prefixesPsr0[$first][$prefix], 141 | (array) $paths 142 | ); 143 | } 144 | } 145 | 146 | /** 147 | * Registers a set of PSR-4 directories for a given namespace, either 148 | * appending or prepending to the ones previously set for this namespace. 149 | * 150 | * @param string $prefix The prefix/namespace, with trailing '\\' 151 | * @param array|string $paths The PSR-4 base directories 152 | * @param bool $prepend Whether to prepend the directories 153 | * 154 | * @throws \InvalidArgumentException 155 | */ 156 | public function addPsr4($prefix, $paths, $prepend = false) 157 | { 158 | if (!$prefix) { 159 | // Register directories for the root namespace. 160 | if ($prepend) { 161 | $this->fallbackDirsPsr4 = array_merge( 162 | (array) $paths, 163 | $this->fallbackDirsPsr4 164 | ); 165 | } else { 166 | $this->fallbackDirsPsr4 = array_merge( 167 | $this->fallbackDirsPsr4, 168 | (array) $paths 169 | ); 170 | } 171 | } elseif (!isset($this->prefixDirsPsr4[$prefix])) { 172 | // Register directories for a new namespace. 173 | $length = strlen($prefix); 174 | if ('\\' !== $prefix[$length - 1]) { 175 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); 176 | } 177 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; 178 | $this->prefixDirsPsr4[$prefix] = (array) $paths; 179 | } elseif ($prepend) { 180 | // Prepend directories for an already registered namespace. 181 | $this->prefixDirsPsr4[$prefix] = array_merge( 182 | (array) $paths, 183 | $this->prefixDirsPsr4[$prefix] 184 | ); 185 | } else { 186 | // Append directories for an already registered namespace. 187 | $this->prefixDirsPsr4[$prefix] = array_merge( 188 | $this->prefixDirsPsr4[$prefix], 189 | (array) $paths 190 | ); 191 | } 192 | } 193 | 194 | /** 195 | * Registers a set of PSR-0 directories for a given prefix, 196 | * replacing any others previously set for this prefix. 197 | * 198 | * @param string $prefix The prefix 199 | * @param array|string $paths The PSR-0 base directories 200 | */ 201 | public function set($prefix, $paths) 202 | { 203 | if (!$prefix) { 204 | $this->fallbackDirsPsr0 = (array) $paths; 205 | } else { 206 | $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; 207 | } 208 | } 209 | 210 | /** 211 | * Registers a set of PSR-4 directories for a given namespace, 212 | * replacing any others previously set for this namespace. 213 | * 214 | * @param string $prefix The prefix/namespace, with trailing '\\' 215 | * @param array|string $paths The PSR-4 base directories 216 | * 217 | * @throws \InvalidArgumentException 218 | */ 219 | public function setPsr4($prefix, $paths) 220 | { 221 | if (!$prefix) { 222 | $this->fallbackDirsPsr4 = (array) $paths; 223 | } else { 224 | $length = strlen($prefix); 225 | if ('\\' !== $prefix[$length - 1]) { 226 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); 227 | } 228 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; 229 | $this->prefixDirsPsr4[$prefix] = (array) $paths; 230 | } 231 | } 232 | 233 | /** 234 | * Turns on searching the include path for class files. 235 | * 236 | * @param bool $useIncludePath 237 | */ 238 | public function setUseIncludePath($useIncludePath) 239 | { 240 | $this->useIncludePath = $useIncludePath; 241 | } 242 | 243 | /** 244 | * Can be used to check if the autoloader uses the include path to check 245 | * for classes. 246 | * 247 | * @return bool 248 | */ 249 | public function getUseIncludePath() 250 | { 251 | return $this->useIncludePath; 252 | } 253 | 254 | /** 255 | * Turns off searching the prefix and fallback directories for classes 256 | * that have not been registered with the class map. 257 | * 258 | * @param bool $classMapAuthoritative 259 | */ 260 | public function setClassMapAuthoritative($classMapAuthoritative) 261 | { 262 | $this->classMapAuthoritative = $classMapAuthoritative; 263 | } 264 | 265 | /** 266 | * Should class lookup fail if not found in the current class map? 267 | * 268 | * @return bool 269 | */ 270 | public function isClassMapAuthoritative() 271 | { 272 | return $this->classMapAuthoritative; 273 | } 274 | 275 | /** 276 | * APCu prefix to use to cache found/not-found classes, if the extension is enabled. 277 | * 278 | * @param string|null $apcuPrefix 279 | */ 280 | public function setApcuPrefix($apcuPrefix) 281 | { 282 | $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; 283 | } 284 | 285 | /** 286 | * The APCu prefix in use, or null if APCu caching is not enabled. 287 | * 288 | * @return string|null 289 | */ 290 | public function getApcuPrefix() 291 | { 292 | return $this->apcuPrefix; 293 | } 294 | 295 | /** 296 | * Registers this instance as an autoloader. 297 | * 298 | * @param bool $prepend Whether to prepend the autoloader or not 299 | */ 300 | public function register($prepend = false) 301 | { 302 | spl_autoload_register(array($this, 'loadClass'), true, $prepend); 303 | } 304 | 305 | /** 306 | * Unregisters this instance as an autoloader. 307 | */ 308 | public function unregister() 309 | { 310 | spl_autoload_unregister(array($this, 'loadClass')); 311 | } 312 | 313 | /** 314 | * Loads the given class or interface. 315 | * 316 | * @param string $class The name of the class 317 | * @return bool|null True if loaded, null otherwise 318 | */ 319 | public function loadClass($class) 320 | { 321 | if ($file = $this->findFile($class)) { 322 | includeFile($file); 323 | 324 | return true; 325 | } 326 | } 327 | 328 | /** 329 | * Finds the path to the file where the class is defined. 330 | * 331 | * @param string $class The name of the class 332 | * 333 | * @return string|false The path if found, false otherwise 334 | */ 335 | public function findFile($class) 336 | { 337 | // class map lookup 338 | if (isset($this->classMap[$class])) { 339 | return $this->classMap[$class]; 340 | } 341 | if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { 342 | return false; 343 | } 344 | if (null !== $this->apcuPrefix) { 345 | $file = apcu_fetch($this->apcuPrefix.$class, $hit); 346 | if ($hit) { 347 | return $file; 348 | } 349 | } 350 | 351 | $file = $this->findFileWithExtension($class, '.php'); 352 | 353 | // Search for Hack files if we are running on HHVM 354 | if (false === $file && defined('HHVM_VERSION')) { 355 | $file = $this->findFileWithExtension($class, '.hh'); 356 | } 357 | 358 | if (null !== $this->apcuPrefix) { 359 | apcu_add($this->apcuPrefix.$class, $file); 360 | } 361 | 362 | if (false === $file) { 363 | // Remember that this class does not exist. 364 | $this->missingClasses[$class] = true; 365 | } 366 | 367 | return $file; 368 | } 369 | 370 | private function findFileWithExtension($class, $ext) 371 | { 372 | // PSR-4 lookup 373 | $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; 374 | 375 | $first = $class[0]; 376 | if (isset($this->prefixLengthsPsr4[$first])) { 377 | $subPath = $class; 378 | while (false !== $lastPos = strrpos($subPath, '\\')) { 379 | $subPath = substr($subPath, 0, $lastPos); 380 | $search = $subPath.'\\'; 381 | if (isset($this->prefixDirsPsr4[$search])) { 382 | foreach ($this->prefixDirsPsr4[$search] as $dir) { 383 | $length = $this->prefixLengthsPsr4[$first][$search]; 384 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { 385 | return $file; 386 | } 387 | } 388 | } 389 | } 390 | } 391 | 392 | // PSR-4 fallback dirs 393 | foreach ($this->fallbackDirsPsr4 as $dir) { 394 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { 395 | return $file; 396 | } 397 | } 398 | 399 | // PSR-0 lookup 400 | if (false !== $pos = strrpos($class, '\\')) { 401 | // namespaced class name 402 | $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) 403 | . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); 404 | } else { 405 | // PEAR-like class name 406 | $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; 407 | } 408 | 409 | if (isset($this->prefixesPsr0[$first])) { 410 | foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { 411 | if (0 === strpos($class, $prefix)) { 412 | foreach ($dirs as $dir) { 413 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { 414 | return $file; 415 | } 416 | } 417 | } 418 | } 419 | } 420 | 421 | // PSR-0 fallback dirs 422 | foreach ($this->fallbackDirsPsr0 as $dir) { 423 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { 424 | return $file; 425 | } 426 | } 427 | 428 | // PSR-0 include paths. 429 | if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { 430 | return $file; 431 | } 432 | 433 | return false; 434 | } 435 | } 436 | 437 | /** 438 | * Scope isolated include. 439 | * 440 | * Prevents access to $this/self from included files. 441 | */ 442 | function includeFile($file) 443 | { 444 | include $file; 445 | } 446 | -------------------------------------------------------------------------------- /vendor/composer/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Copyright (c) Nils Adermann, Jordi Boggiano 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is furnished 9 | to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /vendor/composer/autoload_classmap.php: -------------------------------------------------------------------------------- 1 | $baseDir . '/app/controllers/PagesController.php', 10 | 'App\\Controllers\\TasksController' => $baseDir . '/app/controllers/TasksController.php', 11 | 'App\\Core\\App' => $baseDir . '/core/App.php', 12 | 'App\\Core\\Database\\Connection' => $baseDir . '/core/database/Connection.php', 13 | 'App\\Core\\Database\\QueryBuilder' => $baseDir . '/core/database/QueryBuilder.php', 14 | 'App\\Core\\Request' => $baseDir . '/core/Request.php', 15 | 'App\\Core\\Router' => $baseDir . '/core/Router.php', 16 | 'App\\Models\\Task' => $baseDir . '/app/models/Task.php', 17 | 'ComposerAutoloaderInitcd997264070b57f3eabc9c8e678a8f75' => $vendorDir . '/composer/autoload_real.php', 18 | 'Composer\\Autoload\\ClassLoader' => $vendorDir . '/composer/ClassLoader.php', 19 | 'Composer\\Autoload\\ComposerStaticInitcd997264070b57f3eabc9c8e678a8f75' => $vendorDir . '/composer/autoload_static.php', 20 | ); 21 | -------------------------------------------------------------------------------- /vendor/composer/autoload_files.php: -------------------------------------------------------------------------------- 1 | $baseDir . '/core/helpers.php', 10 | ); 11 | -------------------------------------------------------------------------------- /vendor/composer/autoload_namespaces.php: -------------------------------------------------------------------------------- 1 | = 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); 27 | if ($useStaticLoader) { 28 | require_once __DIR__ . '/autoload_static.php'; 29 | 30 | call_user_func(\Composer\Autoload\ComposerStaticInitcd997264070b57f3eabc9c8e678a8f75::getInitializer($loader)); 31 | } else { 32 | $map = require __DIR__ . '/autoload_namespaces.php'; 33 | foreach ($map as $namespace => $path) { 34 | $loader->set($namespace, $path); 35 | } 36 | 37 | $map = require __DIR__ . '/autoload_psr4.php'; 38 | foreach ($map as $namespace => $path) { 39 | $loader->setPsr4($namespace, $path); 40 | } 41 | 42 | $classMap = require __DIR__ . '/autoload_classmap.php'; 43 | if ($classMap) { 44 | $loader->addClassMap($classMap); 45 | } 46 | } 47 | 48 | $loader->register(true); 49 | 50 | if ($useStaticLoader) { 51 | $includeFiles = Composer\Autoload\ComposerStaticInitcd997264070b57f3eabc9c8e678a8f75::$files; 52 | } else { 53 | $includeFiles = require __DIR__ . '/autoload_files.php'; 54 | } 55 | foreach ($includeFiles as $fileIdentifier => $file) { 56 | composerRequirecd997264070b57f3eabc9c8e678a8f75($fileIdentifier, $file); 57 | } 58 | 59 | return $loader; 60 | } 61 | } 62 | 63 | function composerRequirecd997264070b57f3eabc9c8e678a8f75($fileIdentifier, $file) 64 | { 65 | if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { 66 | require $file; 67 | 68 | $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /vendor/composer/autoload_static.php: -------------------------------------------------------------------------------- 1 | __DIR__ . '/../..' . '/core/helpers.php', 11 | ); 12 | 13 | public static $classMap = array ( 14 | 'App\\Controllers\\PagesController' => __DIR__ . '/../..' . '/app/controllers/PagesController.php', 15 | 'App\\Controllers\\TasksController' => __DIR__ . '/../..' . '/app/controllers/TasksController.php', 16 | 'App\\Core\\App' => __DIR__ . '/../..' . '/core/App.php', 17 | 'App\\Core\\Database\\Connection' => __DIR__ . '/../..' . '/core/database/Connection.php', 18 | 'App\\Core\\Database\\QueryBuilder' => __DIR__ . '/../..' . '/core/database/QueryBuilder.php', 19 | 'App\\Core\\Request' => __DIR__ . '/../..' . '/core/Request.php', 20 | 'App\\Core\\Router' => __DIR__ . '/../..' . '/core/Router.php', 21 | 'App\\Models\\Task' => __DIR__ . '/../..' . '/app/models/Task.php', 22 | 'ComposerAutoloaderInitcd997264070b57f3eabc9c8e678a8f75' => __DIR__ . '/..' . '/composer/autoload_real.php', 23 | 'Composer\\Autoload\\ClassLoader' => __DIR__ . '/..' . '/composer/ClassLoader.php', 24 | 'Composer\\Autoload\\ComposerStaticInitcd997264070b57f3eabc9c8e678a8f75' => __DIR__ . '/..' . '/composer/autoload_static.php', 25 | ); 26 | 27 | public static function getInitializer(ClassLoader $loader) 28 | { 29 | return \Closure::bind(function () use ($loader) { 30 | $loader->classMap = ComposerStaticInitcd997264070b57f3eabc9c8e678a8f75::$classMap; 31 | 32 | }, null, ClassLoader::class); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /vendor/composer/installed.json: -------------------------------------------------------------------------------- 1 | [] 2 | --------------------------------------------------------------------------------