├── composer.phar
├── vendor
├── composer
│ ├── installed.json
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_files.php
│ ├── autoload_classmap.php
│ ├── installed.php
│ ├── LICENSE
│ ├── autoload_static.php
│ ├── autoload_real.php
│ ├── InstalledVersions.php
│ └── ClassLoader.php
└── autoload.php
├── config.php
├── public_html
├── .htaccess
├── client.php
├── client.html
└── index.php
├── composer.json
├── composer.lock
├── App
├── Services
│ └── UserService.php
└── Models
│ └── User.php
└── serie_login.sql
/composer.phar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RafaelCapo/api_rest_2021/HEAD/composer.phar
--------------------------------------------------------------------------------
/vendor/composer/installed.json:
--------------------------------------------------------------------------------
1 | {
2 | "packages": [],
3 | "dev": true,
4 | "dev-package-names": []
5 | }
6 |
--------------------------------------------------------------------------------
/config.php:
--------------------------------------------------------------------------------
1 | array($baseDir . '/App'),
10 | );
11 |
--------------------------------------------------------------------------------
/vendor/composer/autoload_files.php:
--------------------------------------------------------------------------------
1 | $baseDir . '/config.php',
10 | );
11 |
--------------------------------------------------------------------------------
/vendor/composer/autoload_classmap.php:
--------------------------------------------------------------------------------
1 | $vendorDir . '/composer/InstalledVersions.php',
10 | );
11 |
--------------------------------------------------------------------------------
/public_html/client.php:
--------------------------------------------------------------------------------
1 |
3 | array (
4 | 'pretty_version' => '1.0.0+no-version-set',
5 | 'version' => '1.0.0.0',
6 | 'aliases' =>
7 | array (
8 | ),
9 | 'reference' => NULL,
10 | 'name' => '__root__',
11 | ),
12 | 'versions' =>
13 | array (
14 | '__root__' =>
15 | array (
16 | 'pretty_version' => '1.0.0+no-version-set',
17 | 'version' => '1.0.0.0',
18 | 'aliases' =>
19 | array (
20 | ),
21 | 'reference' => NULL,
22 | ),
23 | ),
24 | );
25 |
--------------------------------------------------------------------------------
/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": "8d070178755c320c69f93ee4800660ef",
8 | "packages": [],
9 | "packages-dev": [],
10 | "aliases": [],
11 | "minimum-stability": "stable",
12 | "stability-flags": [],
13 | "prefer-stable": false,
14 | "prefer-lowest": false,
15 | "platform": [],
16 | "platform-dev": [],
17 | "plugin-api-version": "2.0.0"
18 | }
19 |
--------------------------------------------------------------------------------
/public_html/client.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Page Title
6 |
7 |
8 |
9 |
10 |
22 |
23 |
--------------------------------------------------------------------------------
/App/Services/UserService.php:
--------------------------------------------------------------------------------
1 | 'sucess', 'data' => $response));
23 | exit;
24 | } catch (\Exception $e) {
25 | http_response_code(404);
26 | echo json_encode(array('status' => 'error', 'data' => $e->getMessage()), JSON_UNESCAPED_UNICODE);
27 | exit;
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/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_static.php:
--------------------------------------------------------------------------------
1 | __DIR__ . '/../..' . '/config.php',
11 | );
12 |
13 | public static $prefixLengthsPsr4 = array (
14 | 'A' =>
15 | array (
16 | 'App\\' => 4,
17 | ),
18 | );
19 |
20 | public static $prefixDirsPsr4 = array (
21 | 'App\\' =>
22 | array (
23 | 0 => __DIR__ . '/../..' . '/App',
24 | ),
25 | );
26 |
27 | public static $classMap = array (
28 | 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
29 | );
30 |
31 | public static function getInitializer(ClassLoader $loader)
32 | {
33 | return \Closure::bind(function () use ($loader) {
34 | $loader->prefixLengthsPsr4 = ComposerStaticInit3fa3c5016cd7f9401a45d15d0ddb2e66::$prefixLengthsPsr4;
35 | $loader->prefixDirsPsr4 = ComposerStaticInit3fa3c5016cd7f9401a45d15d0ddb2e66::$prefixDirsPsr4;
36 | $loader->classMap = ComposerStaticInit3fa3c5016cd7f9401a45d15d0ddb2e66::$classMap;
37 |
38 | }, null, ClassLoader::class);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/serie_login.sql:
--------------------------------------------------------------------------------
1 | -- phpMyAdmin SQL Dump
2 | -- version 4.8.5
3 | -- https://www.phpmyadmin.net/
4 | --
5 | -- Host: 127.0.0.1:3306
6 | -- Generation Time: 30-Dez-2020 às 17:35
7 | -- Versão do servidor: 5.7.26
8 | -- versão do PHP: 7.2.18
9 |
10 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
11 | SET AUTOCOMMIT = 0;
12 | START TRANSACTION;
13 | SET time_zone = "+00:00";
14 |
15 |
16 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
17 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
18 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
19 | /*!40101 SET NAMES utf8mb4 */;
20 |
21 | --
22 | -- Database: `serie_login`
23 | --
24 |
25 | -- --------------------------------------------------------
26 |
27 | --
28 | -- Estrutura da tabela `user`
29 | --
30 |
31 | DROP TABLE IF EXISTS `user`;
32 | CREATE TABLE IF NOT EXISTS `user` (
33 | `id` int(11) NOT NULL AUTO_INCREMENT,
34 | `email` varchar(200) NOT NULL,
35 | `password` varchar(300) NOT NULL,
36 | `name` varchar(100) DEFAULT NULL,
37 | PRIMARY KEY (`id`),
38 | UNIQUE KEY `email` (`email`)
39 | ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
40 |
41 | --
42 | -- Extraindo dados da tabela `user`
43 | --
44 |
45 | INSERT INTO `user` (`id`, `email`, `password`, `name`) VALUES
46 | (1, 'rafa@gmail.com', '123', 'Rafa'),
47 | (2, 'bruno@gmail.com', '123', 'asdasd');
48 | COMMIT;
49 |
50 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
51 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
52 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
53 |
--------------------------------------------------------------------------------
/App/Models/User.php:
--------------------------------------------------------------------------------
1 | prepare($sql);
13 | $stmt->bindValue(':id', $id);
14 | $stmt->execute();
15 |
16 | if ($stmt->rowCount() > 0) {
17 | return $stmt->fetch(\PDO::FETCH_ASSOC);
18 | } else {
19 | throw new \Exception("Nenhum usuário encontrado!");
20 | }
21 | }
22 |
23 | public static function selectAll() {
24 | $connPdo = new \PDO(DBDRIVE.': host='.DBHOST.'; dbname='.DBNAME, DBUSER, DBPASS);
25 |
26 | $sql = 'SELECT * FROM '.self::$table;
27 | $stmt = $connPdo->prepare($sql);
28 | $stmt->execute();
29 |
30 | if ($stmt->rowCount() > 0) {
31 | return $stmt->fetchAll(\PDO::FETCH_ASSOC);
32 | } else {
33 | throw new \Exception("Nenhum usuário encontrado!");
34 | }
35 | }
36 |
37 | public static function insert($data)
38 | {
39 | $connPdo = new \PDO(DBDRIVE.': host='.DBHOST.'; dbname='.DBNAME, DBUSER, DBPASS);
40 |
41 | $sql = 'INSERT INTO '.self::$table.' (email, password, name) VALUES (:em, :pa, :na)';
42 | $stmt = $connPdo->prepare($sql);
43 | $stmt->bindValue(':em', $data['email']);
44 | $stmt->bindValue(':pa', $data['password']);
45 | $stmt->bindValue(':na', $data['name']);
46 | $stmt->execute();
47 |
48 | if ($stmt->rowCount() > 0) {
49 | return 'Usuário(a) inserido com sucesso!';
50 | } else {
51 | throw new \Exception("Falha ao inserir usuário(a)!");
52 | }
53 | }
54 | }
--------------------------------------------------------------------------------
/vendor/composer/autoload_real.php:
--------------------------------------------------------------------------------
1 | = 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30 | if ($useStaticLoader) {
31 | require __DIR__ . '/autoload_static.php';
32 |
33 | call_user_func(\Composer\Autoload\ComposerStaticInit3fa3c5016cd7f9401a45d15d0ddb2e66::getInitializer($loader));
34 | } else {
35 | $map = require __DIR__ . '/autoload_namespaces.php';
36 | foreach ($map as $namespace => $path) {
37 | $loader->set($namespace, $path);
38 | }
39 |
40 | $map = require __DIR__ . '/autoload_psr4.php';
41 | foreach ($map as $namespace => $path) {
42 | $loader->setPsr4($namespace, $path);
43 | }
44 |
45 | $classMap = require __DIR__ . '/autoload_classmap.php';
46 | if ($classMap) {
47 | $loader->addClassMap($classMap);
48 | }
49 | }
50 |
51 | $loader->register(true);
52 |
53 | if ($useStaticLoader) {
54 | $includeFiles = Composer\Autoload\ComposerStaticInit3fa3c5016cd7f9401a45d15d0ddb2e66::$files;
55 | } else {
56 | $includeFiles = require __DIR__ . '/autoload_files.php';
57 | }
58 | foreach ($includeFiles as $fileIdentifier => $file) {
59 | composerRequire3fa3c5016cd7f9401a45d15d0ddb2e66($fileIdentifier, $file);
60 | }
61 |
62 | return $loader;
63 | }
64 | }
65 |
66 | function composerRequire3fa3c5016cd7f9401a45d15d0ddb2e66($fileIdentifier, $file)
67 | {
68 | if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
69 | require $file;
70 |
71 | $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/vendor/composer/InstalledVersions.php:
--------------------------------------------------------------------------------
1 |
16 | array (
17 | 'pretty_version' => '1.0.0+no-version-set',
18 | 'version' => '1.0.0.0',
19 | 'aliases' =>
20 | array (
21 | ),
22 | 'reference' => NULL,
23 | 'name' => '__root__',
24 | ),
25 | 'versions' =>
26 | array (
27 | '__root__' =>
28 | array (
29 | 'pretty_version' => '1.0.0+no-version-set',
30 | 'version' => '1.0.0.0',
31 | 'aliases' =>
32 | array (
33 | ),
34 | 'reference' => NULL,
35 | ),
36 | ),
37 | );
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | public static function getInstalledPackages()
46 | {
47 | return array_keys(self::$installed['versions']);
48 | }
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 | public static function isInstalled($packageName)
59 | {
60 | return isset(self::$installed['versions'][$packageName]);
61 | }
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 | public static function satisfies(VersionParser $parser, $packageName, $constraint)
77 | {
78 | $constraint = $parser->parseConstraints($constraint);
79 | $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
80 |
81 | return $provided->matches($constraint);
82 | }
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 | public static function getVersionRanges($packageName)
94 | {
95 | if (!isset(self::$installed['versions'][$packageName])) {
96 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
97 | }
98 |
99 | $ranges = array();
100 | if (isset(self::$installed['versions'][$packageName]['pretty_version'])) {
101 | $ranges[] = self::$installed['versions'][$packageName]['pretty_version'];
102 | }
103 | if (array_key_exists('aliases', self::$installed['versions'][$packageName])) {
104 | $ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']);
105 | }
106 | if (array_key_exists('replaced', self::$installed['versions'][$packageName])) {
107 | $ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']);
108 | }
109 | if (array_key_exists('provided', self::$installed['versions'][$packageName])) {
110 | $ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']);
111 | }
112 |
113 | return implode(' || ', $ranges);
114 | }
115 |
116 |
117 |
118 |
119 |
120 | public static function getVersion($packageName)
121 | {
122 | if (!isset(self::$installed['versions'][$packageName])) {
123 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
124 | }
125 |
126 | if (!isset(self::$installed['versions'][$packageName]['version'])) {
127 | return null;
128 | }
129 |
130 | return self::$installed['versions'][$packageName]['version'];
131 | }
132 |
133 |
134 |
135 |
136 |
137 | public static function getPrettyVersion($packageName)
138 | {
139 | if (!isset(self::$installed['versions'][$packageName])) {
140 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
141 | }
142 |
143 | if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) {
144 | return null;
145 | }
146 |
147 | return self::$installed['versions'][$packageName]['pretty_version'];
148 | }
149 |
150 |
151 |
152 |
153 |
154 | public static function getReference($packageName)
155 | {
156 | if (!isset(self::$installed['versions'][$packageName])) {
157 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
158 | }
159 |
160 | if (!isset(self::$installed['versions'][$packageName]['reference'])) {
161 | return null;
162 | }
163 |
164 | return self::$installed['versions'][$packageName]['reference'];
165 | }
166 |
167 |
168 |
169 |
170 |
171 | public static function getRootPackage()
172 | {
173 | return self::$installed['root'];
174 | }
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 | public static function getRawData()
183 | {
184 | return self::$installed;
185 | }
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 | public static function reload($data)
206 | {
207 | self::$installed = $data;
208 | }
209 | }
210 |
--------------------------------------------------------------------------------
/vendor/composer/ClassLoader.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 https://www.php-fig.org/psr/psr-0/
41 | * @see https://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', array_values($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') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $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 | $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
383 | foreach ($this->prefixDirsPsr4[$search] as $dir) {
384 | if (file_exists($file = $dir . $pathEnd)) {
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 |
--------------------------------------------------------------------------------