├── .dockerignore ├── .editorconfig ├── .env.example ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── Dockerfile ├── LICENSE.md ├── Makefile ├── app ├── Accounts.php ├── Auth.php ├── Console │ ├── Commands │ │ └── .gitkeep │ └── Kernel.php ├── Events │ ├── Event.php │ ├── UserCreated.php │ └── UserUpdated.php ├── Exceptions │ ├── Handler.php │ └── UnauthorizedException.php ├── Http │ ├── Controllers │ │ ├── AuthController.php │ │ ├── Controller.php │ │ └── UserController.php │ └── Middleware │ │ ├── Authenticate.php │ │ └── ExampleMiddleware.php ├── Jobs │ └── Job.php ├── Listeners │ ├── SendPasswordChangeNotification.php │ └── SendWelcomeEmail.php ├── Models │ └── User.php ├── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ └── EventServiceProvider.php ├── Serializers │ └── ErrorSerializer.php ├── Traits │ ├── AttributeHashable.php │ ├── ExceptionRenderable.php │ ├── ModelValidatable.php │ └── QueryFilterable.php └── Transformers │ ├── ErrorTransformer.php │ ├── TokenTransformer.php │ └── UserTransformer.php ├── artisan ├── bootstrap ├── app.php └── helpers.php ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── cors.php ├── database.php ├── filesystems.php ├── fractal.php ├── jwt.php ├── logging.php ├── query-builder.php ├── queue.php ├── services.php └── view.php ├── database ├── factories │ └── UserFactory.php ├── migrations │ └── 2018_12_25_085051_create_users_table.php ├── seeders │ └── DatabaseSeeder.php └── seeds │ └── DatabaseSeeder.php ├── docker-compose.local.yml ├── docker-compose.yml ├── docker ├── mysql │ ├── my.cnf │ └── mysql.cnf ├── nginx │ └── default.conf └── php │ └── php.ini ├── phpunit.xml ├── public ├── .htaccess └── index.php ├── readme.md ├── resources └── views │ └── .gitkeep ├── routes └── web.php ├── storage ├── app │ └── .gitignore ├── framework │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore └── tests ├── ExampleTest.php └── TestCase.php /.dockerignore: -------------------------------------------------------------------------------- 1 | .git/ 2 | .docker/ 3 | .env 4 | docker-composer.yml 5 | bootstrap/cache/* 6 | storage/app/* 7 | storage/framework/cache/* 8 | storage/framework/views/* 9 | storage/logs/* 10 | vendor/ 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.yml] 15 | indent_size = 2 16 | 17 | [Makefile] 18 | indent_style = tab 19 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Lumen 2 | APP_VERSION=0.0.1 3 | APP_ENV=local 4 | APP_KEY= 5 | APP_DEBUG=true 6 | APP_URL=http://127.0.0.1:8000 7 | APP_TIMEZONE=UTC 8 | 9 | LOG_CHANNEL=stack 10 | LOG_SLACK_WEBHOOK_URL= 11 | 12 | DB_CONNECTION=mysql 13 | DB_HOST=db 14 | DB_PORT=3306 15 | DB_DATABASE=lumen-api-starter 16 | DB_USERNAME=user 17 | DB_PASSWORD=secret 18 | 19 | CACHE_DRIVER=file 20 | QUEUE_CONNECTION=sync 21 | 22 | JWT_SECRET= 23 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout code 15 | uses: actions/checkout@v2 16 | 17 | - name: Build Docker image 18 | run: make build 19 | 20 | - name: Run tests 21 | run: make test 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /.idea 3 | docker-compose.override.yml 4 | Homestead.json 5 | Homestead.yaml 6 | .env 7 | .phpunit.result.cache 8 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM composer:2 as vendor 2 | 3 | COPY ./database ./database 4 | COPY ./tests ./tests 5 | 6 | COPY composer.json composer.json 7 | COPY composer.lock composer.lock 8 | 9 | RUN composer install \ 10 | --ignore-platform-reqs \ 11 | --no-interaction \ 12 | --no-plugins \ 13 | --no-scripts \ 14 | --prefer-dist 15 | 16 | 17 | FROM php:7.4-fpm-alpine 18 | 19 | WORKDIR /var/www/html 20 | 21 | COPY . . 22 | COPY --from=vendor /app/vendor ./vendor/ 23 | COPY ./docker/php/php.ini /usr/local/etc/php/php.ini 24 | 25 | RUN apk add --no-cache \ 26 | oniguruma-dev \ 27 | mysql-client \ 28 | libxml2-dev \ 29 | # If you have enabled gd plugin 30 | # libpng-dev \ 31 | # libjpeg-turbo-dev \ 32 | # freetype-dev \ 33 | git \ 34 | zip \ 35 | unzip \ 36 | curl 37 | 38 | RUN docker-php-ext-install \ 39 | bcmath \ 40 | mbstring \ 41 | pdo \ 42 | pdo_mysql \ 43 | tokenizer \ 44 | xml 45 | 46 | # If you need to work with image manipulation. 47 | # RUN docker-php-ext-configure gd --with-freetype --with-jpeg 48 | # RUN docker-php-ext-install gd 49 | 50 | RUN adduser www-data www-data 51 | 52 | RUN chown -R www-data:www-data . 53 | 54 | USER www-data 55 | 56 | EXPOSE 9000 57 | 58 | CMD ["php-fpm"] 59 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Tawsif aqib 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME="Lumen API Starter" 2 | IMAGE_NAME="lumen-api-starter-app" 3 | 4 | .PHONY: help 5 | 6 | help: 7 | @echo "\n\033[1;32m${PROJECT_NAME}\033[0m\n" 8 | @echo "\033[4mCommands:\033[0m\n" 9 | @echo "make [command]\n" 10 | @grep -E '^[a-zA-Z_-]+:.*?## .*$$' ${MAKEFILE_LIST} | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-10s\033[0m %s\n", $$1, $$2}' 11 | 12 | build: ## Build all Docker images 13 | @docker build . --file Dockerfile --tag ${IMAGE_NAME}:latest 14 | 15 | up: ## Start all Docker services 16 | @docker-compose up -d 17 | 18 | stop: ## Stop all Docker services 19 | @docker-compose stop 20 | 21 | down: ## Down all Docker services 22 | @docker-compose down 23 | 24 | logs: ## Follow logs from Docker service app 25 | @docker-compose logs -f app 26 | 27 | ssh: ## SSH into Docker service app 28 | @docker-compose run --rm app sh 29 | 30 | composer: ## SSH into a Composer container 31 | @docker run --rm -it -v $(PWD):/app composer:2 sh 32 | 33 | dev-test: ## Run test withing Docker-Compose 34 | @docker-compose run --rm app vendor/bin/phpunit 35 | 36 | install: ## Install Composeer dependencies 37 | @docker run --rm -v $(PWD):/app composer:2 composer install 38 | 39 | test: build ## Run PHPUnit tests 40 | @docker run --rm ${IMAGE_NAME}:latest vendor/bin/phpunit 41 | -------------------------------------------------------------------------------- /app/Accounts.php: -------------------------------------------------------------------------------- 1 | paginate($request->get('per_page', 20)); 23 | 24 | return fractal($users, new UserTransformer())->toArray(); 25 | } 26 | 27 | /** 28 | * Get a user by ID. 29 | * 30 | * @param int $id 31 | * @return array 32 | * 33 | * @throws \Illuminate\Database\Eloquent\ModelNotFoundException 34 | */ 35 | public function getUserById(int $id): array 36 | { 37 | $user = User::findOrFail($id); 38 | 39 | return fractal($user, new UserTransformer())->toArray(); 40 | } 41 | 42 | /** 43 | * Store a new user. 44 | * 45 | * @param array $attrs 46 | * @return array 47 | * 48 | * @throws \Illuminate\Validation\ValidationException 49 | */ 50 | public function storeUser(array $attrs): array 51 | { 52 | $user = new User($attrs); 53 | 54 | if (!$user->isValidFor('CREATE')) { 55 | throw new ValidationException($user->validator()); 56 | } 57 | 58 | $user->save(); 59 | 60 | event(new UserCreated($user)); 61 | 62 | return fractal($user, new UserTransformer())->toArray(); 63 | } 64 | 65 | /** 66 | * Update a user by ID. 67 | * 68 | * @param int $id 69 | * @param array $attrs 70 | * @return array 71 | * 72 | * @throws \Illuminate\Database\Eloquent\ModelNotFoundException 73 | * @throws \Illuminate\Validation\ValidationException 74 | */ 75 | public function updateUserById(int $id, array $attrs): array 76 | { 77 | $user = User::findOrFail($id); 78 | $user->fill($attrs); 79 | 80 | if (!$user->isValidFor('UPDATE')) { 81 | throw new ValidationException($user->validator()); 82 | } 83 | 84 | $changes = $user->getDirty(); 85 | $user->save(); 86 | 87 | event(new UserUpdated($user, $changes)); 88 | 89 | return fractal($user, new UserTransformer())->toArray(); 90 | } 91 | 92 | /** 93 | * Delete a user by ID. 94 | * 95 | * @param int $id 96 | * @return bool 97 | * 98 | * @throws \Illuminate\Database\Eloquent\ModelNotFoundException 99 | */ 100 | public function deleteUserById(int $id): bool 101 | { 102 | $user = User::findOrFail($id); 103 | 104 | return (bool) $user->delete(); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /app/Auth.php: -------------------------------------------------------------------------------- 1 | attempt(compact('email', 'password'))) { 21 | throw new UnauthorizedException(); 22 | } 23 | 24 | return fractal($token, new TokenTransformer())->toArray(); 25 | } 26 | 27 | /** 28 | * Get the current authenticated user. 29 | * 30 | * @return array 31 | */ 32 | public function getAuthenticatedUser(): array 33 | { 34 | $user = app('auth')->user(); 35 | 36 | return fractal($user, new UserTransformer())->toArray(); 37 | } 38 | 39 | /** 40 | * Refresh current authentication token. 41 | * 42 | * @return array 43 | */ 44 | public function refreshAuthenticationToken(): array 45 | { 46 | $token = app('auth')->refresh(); 47 | 48 | return fractal($token, new TokenTransformer())->toArray(); 49 | } 50 | 51 | /** 52 | * Invalidate current authentication token. 53 | * 54 | * @return bool 55 | */ 56 | public function invalidateAuthenticationToken(): bool 57 | { 58 | return (bool) app('auth')->logout(); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/Console/Commands/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/munza/lumen-api-starter/e72020dda79c6174a73b8ac89463f8754028d26a/app/Console/Commands/.gitkeep -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | user = $user; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Events/UserUpdated.php: -------------------------------------------------------------------------------- 1 | user = $user; 27 | $this->changes = $changes; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | checkIfJsonRenderable($exception)) { 73 | return $this->renderJson($request, $exception); 74 | } 75 | 76 | return parent::render($request, $exception); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /app/Exceptions/UnauthorizedException.php: -------------------------------------------------------------------------------- 1 | auth = $auth; 21 | } 22 | 23 | /** 24 | * Get a JWT via given credentials. 25 | * 26 | * @param Illuminate\Http\Request $request 27 | * @return \Illuminate\Http\JsonResponse 28 | */ 29 | public function store(Request $request): JsonResponse 30 | { 31 | $token = $this->auth->authenticateByEmailAndPassword( 32 | (string) $request->input('email'), 33 | (string) $request->input('password') 34 | ); 35 | 36 | return response()->json($token, Response::HTTP_OK); 37 | } 38 | 39 | /** 40 | * Get the authenticated User. 41 | * 42 | * @return \Illuminate\Http\JsonResponse 43 | */ 44 | public function show(): JsonResponse 45 | { 46 | $user = $this->auth->getAuthenticatedUser(); 47 | 48 | return response()->json($user, Response::HTTP_OK); 49 | } 50 | 51 | /** 52 | * Refresh a token. 53 | * 54 | * @return \Illuminate\Http\JsonResponse 55 | */ 56 | public function update(): JsonResponse 57 | { 58 | $token = $this->auth->refreshAuthenticationToken(); 59 | 60 | return response()->json($token, Response::HTTP_OK); 61 | } 62 | 63 | /** 64 | * Log the user out (Invalidate the token). 65 | * 66 | * @return \Illuminate\Http\JsonResponse 67 | */ 68 | public function destroy(): JsonResponse 69 | { 70 | $this->auth->invalidateAuthenticationToken(); 71 | 72 | return response()->json(null, Response::HTTP_NO_CONTENT); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | accounts = $accounts; 20 | } 21 | 22 | /** 23 | * Get all the users. 24 | * 25 | * @param \Illuminate\Http\Request $request 26 | * @return \Illuminate\Http\JsonResponse 27 | */ 28 | public function index(Request $request): JsonResponse 29 | { 30 | $users = $this->accounts->getUsers($request); 31 | 32 | return response()->json($users, Response::HTTP_OK); 33 | } 34 | 35 | /** 36 | * Store a user. 37 | * 38 | * @param \Illuminate\Http\Request $request 39 | * 40 | * @return \Illuminate\Http\JsonResponse 41 | */ 42 | public function store(Request $request): JsonResponse 43 | { 44 | $user = $this->accounts->storeUser($request->all()); 45 | 46 | return response()->json($user, Response::HTTP_CREATED); 47 | } 48 | 49 | /** 50 | * Get a user. 51 | * 52 | * @param int $id 53 | * 54 | * @return \Illuminate\Http\JsonResponse 55 | */ 56 | public function show(int $id): JsonResponse 57 | { 58 | $user = $this->accounts->getUserById($id); 59 | 60 | return response()->json($user, Response::HTTP_OK); 61 | } 62 | 63 | /** 64 | * Update a user. 65 | * 66 | * @param \Illuminate\Http\Request $request 67 | * @param int $id 68 | * 69 | * @return \Illuminate\Http\JsonResponse 70 | */ 71 | public function update(Request $request, int $id): JsonResponse 72 | { 73 | $user = $this->accounts->updateUserById($id, $request->all()); 74 | 75 | return response()->json($user, Response::HTTP_OK); 76 | } 77 | 78 | /** 79 | * Delete a user. 80 | * 81 | * @param int $id 82 | * 83 | * @return \Illuminate\Http\JsonResponse 84 | */ 85 | public function destroy(int $id): JsonResponse 86 | { 87 | $this->accounts->deleteUserById($id); 88 | 89 | return response()->json(null, Response::HTTP_NO_CONTENT); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | auth = $auth; 27 | } 28 | 29 | /** 30 | * Handle an incoming request. 31 | * 32 | * @param \Illuminate\Http\Request $request 33 | * @param \Closure $next 34 | * @param string|null $guard 35 | * @return mixed 36 | */ 37 | public function handle($request, Closure $next, $guard = null) 38 | { 39 | if ($this->auth->guard($guard)->guest()) { 40 | throw new UnauthorizedException(); 41 | } 42 | 43 | return $next($request); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/Http/Middleware/ExampleMiddleware.php: -------------------------------------------------------------------------------- 1 | changes)) { 28 | return; 29 | } 30 | 31 | // send email to notify the user of his password change event. 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Listeners/SendWelcomeEmail.php: -------------------------------------------------------------------------------- 1 | user->email_verified_at = Carbon::now()->toDateTimeString(); 29 | 30 | $event->user->save(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Models/User.php: -------------------------------------------------------------------------------- 1 | [ 74 | 'name' => 'required', 75 | ], 76 | 'CREATE' => [ 77 | 'email' => 'required|unique:users,email', 78 | 'password' => 'required|min:6', 79 | ], 80 | 'UPDATE' => [ 81 | 'email' => 'required|unique:users,email,' . $this->id, 82 | 'password' => 'sometimes|min:6', 83 | ], 84 | ]; 85 | } 86 | 87 | /** 88 | * Get the identifier that will be stored in the subject claim of the JWT. 89 | * 90 | * @return mixed 91 | */ 92 | public function getJWTIdentifier() 93 | { 94 | return $this->getKey(); 95 | } 96 | 97 | /** 98 | * Return a key value array, containing any custom claims to be added to the JWT. 99 | * 100 | * @return array 101 | */ 102 | public function getJWTCustomClaims(): array 103 | { 104 | return []; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | app['auth']->viaRequest('api', function ($request) { 33 | if ($request->input('api_token')) { 34 | return User::where('api_token', $request->input('api_token'))->first(); 35 | } 36 | }); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Providers/EventServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 18 | Listeners\SendWelcomeEmail::class, 19 | ], 20 | 21 | Events\UserUpdated::class => [ 22 | Listeners\SendPasswordChangeNotification::class, 23 | ], 24 | ]; 25 | } 26 | -------------------------------------------------------------------------------- /app/Serializers/ErrorSerializer.php: -------------------------------------------------------------------------------- 1 | $data]; 19 | } 20 | 21 | /** 22 | * Serialize an item. 23 | * 24 | * @param string $resourceKey 25 | * @param array $data 26 | * @return array 27 | */ 28 | public function item($resourceKey, array $data) 29 | { 30 | return ['error' => $data]; 31 | } 32 | 33 | /** 34 | * Serialize null resource. 35 | * 36 | * @return array 37 | */ 38 | public function null() 39 | { 40 | return ['error' => []]; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Traits/AttributeHashable.php: -------------------------------------------------------------------------------- 1 | hashable as $attribute) { 16 | if (!$model->isDirty($attribute)) { 17 | continue; 18 | } 19 | 20 | $model->attributes[$attribute] = app('hash')->make($model->attributes[$attribute]); 21 | } 22 | }); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Traits/ExceptionRenderable.php: -------------------------------------------------------------------------------- 1 | transformer, $this->serializer)->toArray(); 24 | 25 | return response() 26 | ->json($error) 27 | ->setStatusCode($this->getStatusCodeFromError($error)) 28 | ->withHeaders($this->getHeadersFromException($exception)); 29 | } 30 | 31 | /** 32 | * Check if the exception is renderable with JSON 33 | * 34 | * @param Throwable $exception 35 | * @return bool 36 | */ 37 | private function checkIfJsonRenderable(Throwable $exception): bool 38 | { 39 | return !(config('app.debug') && $exception instanceof Error); 40 | } 41 | 42 | /** 43 | * Get status code from the error body. 44 | * 45 | * @param array $error 46 | * @return int 47 | */ 48 | private function getStatusCodeFromError(array $error): int 49 | { 50 | return Arr::get($error, 'data.status') 51 | ?? Arr::get($error, 'error.status') 52 | ?? Response::HTTP_INTERNAL_SERVER_ERROR; 53 | } 54 | 55 | /** 56 | * Get headers from the exception. 57 | * 58 | * @param Throwable $exception 59 | * @return array 60 | */ 61 | private function getHeadersFromException(Throwable $exception): array 62 | { 63 | if (!method_exists($exception, 'getHeaders')) { 64 | return []; 65 | } 66 | 67 | return call_user_func([$exception, 'getHeaders']); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/Traits/ModelValidatable.php: -------------------------------------------------------------------------------- 1 | validator = app('validator')->make($this->attributes, $this->getRulesFor($action)); 25 | 26 | return (bool) $this->validator()->passes(); 27 | } 28 | 29 | /** 30 | * Get the model validator. 31 | * 32 | * @return \Illuminate\Validation\Validator 33 | */ 34 | public function validator(): Validator 35 | { 36 | return $this->validator; 37 | } 38 | 39 | /** 40 | * Get rules for an action combined with common rules. 41 | * 42 | * @param string $action 43 | * @return array 44 | */ 45 | private function getRulesFor(string $action): array 46 | { 47 | if (!method_exists($this, 'rules')) { 48 | return []; 49 | } 50 | 51 | $commonRules = $this->getRuleByAction('*'); 52 | $actionRules = $this->getRuleByAction($action); 53 | 54 | return array_merge($commonRules, $actionRules); 55 | } 56 | 57 | /** 58 | * Get rules by action. 59 | * 60 | * @param string $action 61 | * @return array 62 | */ 63 | private function getRuleByAction(string $action): array 64 | { 65 | if (!array_key_exists($action, $this->rules())) { 66 | return []; 67 | } 68 | 69 | return $this->rules()[$action]; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /app/Traits/QueryFilterable.php: -------------------------------------------------------------------------------- 1 | query(), $request)) 20 | ->allowedFilters($this->filterable ?? []) 21 | ->allowedSorts($this->sortable ?? []) 22 | ->allowedFields($this->visible ?? []) 23 | ->allowedIncludes($this->includable ?? []) 24 | ->allowedAppends($this->appendable ?? []); 25 | 26 | return $query; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Transformers/ErrorTransformer.php: -------------------------------------------------------------------------------- 1 | (string) $this->parseMessage($exception), 24 | 'status' => (int) $this->parseStatusCode($exception), 25 | ]; 26 | 27 | if (count($details = $this->parseDetails($exception))) { 28 | $error['details'] = $details; 29 | } 30 | 31 | if (config('app.debug')) { 32 | $error['debug'] = [ 33 | 'exception' => get_class($exception), 34 | 'trace' => $this->parseTrace($exception), 35 | ]; 36 | } 37 | 38 | return $error; 39 | } 40 | 41 | /** 42 | * Get the message of the exception. 43 | * 44 | * @param Throwable $exception 45 | * @return string 46 | */ 47 | protected function parseMessage(Throwable $exception): string 48 | { 49 | if (!config('app.debug') && Response::HTTP_INTERNAL_SERVER_ERROR === $this->parseStatusCode($exception)) { 50 | return "Something went wrong!"; 51 | } 52 | 53 | switch (true) { 54 | case $exception instanceof NotFoundHttpException: 55 | return "Not found"; 56 | 57 | // Add custom messages for other exceptions. 58 | } 59 | 60 | if (method_exists($exception, 'getMessage') && ($message = $exception->getMessage()) != '') { 61 | return $message; 62 | } 63 | 64 | return "Something went wrong!"; 65 | } 66 | 67 | /** 68 | * Get the status code of the exception. 69 | * 70 | * @param Throwable $exception 71 | * @return int 72 | */ 73 | protected function parseStatusCode(Throwable $exception): int 74 | { 75 | switch (true) { 76 | case $exception instanceof ModelNotFoundException: 77 | case $exception instanceof NotFoundHttpException: 78 | return Response::HTTP_NOT_FOUND; 79 | 80 | case $exception instanceof ValidationException: 81 | return Response::HTTP_UNPROCESSABLE_ENTITY; 82 | 83 | // Add custom status code for other exceptions. 84 | } 85 | 86 | if (method_exists($exception, 'getStatusCode')) { 87 | return $exception->getStatusCode(); 88 | } 89 | 90 | if (property_exists($exception, 'status')) { 91 | return $exception->status; 92 | } 93 | 94 | return Response::HTTP_INTERNAL_SERVER_ERROR; 95 | } 96 | 97 | /** 98 | * Get the details of the exception. 99 | * 100 | * @param Throwable $exception 101 | * @return array 102 | */ 103 | protected function parseDetails(Throwable $exception): array 104 | { 105 | if (method_exists($exception, 'getDetails')) { 106 | return $exception->getDetails(); 107 | } 108 | 109 | if (method_exists($exception, 'errors')) { 110 | return $exception->errors(); 111 | } 112 | 113 | return []; 114 | } 115 | 116 | /** 117 | * Get the trace of the exception. 118 | * 119 | * @param Throwable $exception 120 | * @return array 121 | */ 122 | protected function parseTrace(Throwable $exception): array 123 | { 124 | return preg_split("/\n/", $exception->getTraceAsString()); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /app/Transformers/TokenTransformer.php: -------------------------------------------------------------------------------- 1 | (string) $token, 19 | 'token_type' => 'bearer', 20 | 'expires_in' => (string) app('auth')->factory()->getTTL() * 60, 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Transformers/UserTransformer.php: -------------------------------------------------------------------------------- 1 | (int) $user->id, 20 | 'name' => (string) $user->name, 21 | 'email' => (string) $user->email, 22 | ]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make( 32 | 'Illuminate\Contracts\Console\Kernel' 33 | ); 34 | 35 | exit($kernel->handle(new ArgvInput, new ConsoleOutput)); 36 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | bootstrap(); 8 | 9 | date_default_timezone_set(env('APP_TIMEZONE', 'UTC')); 10 | 11 | /* 12 | |-------------------------------------------------------------------------- 13 | | Create The Application 14 | |-------------------------------------------------------------------------- 15 | | 16 | | Here we will load the environment and create the application instance 17 | | that serves as the central piece of this framework. We'll use this 18 | | application as an "IoC" container and router for this framework. 19 | | 20 | */ 21 | 22 | $app = new \Laravel\Lumen\Application( 23 | dirname(__DIR__) 24 | ); 25 | 26 | // $app->withFacades(); 27 | 28 | $app->withEloquent(); 29 | 30 | /* 31 | |-------------------------------------------------------------------------- 32 | | Register Container Bindings 33 | |-------------------------------------------------------------------------- 34 | | 35 | | Now we will register a few bindings in the service container. We will 36 | | register the exception handler and the console kernel. You may add 37 | | your own bindings here if you like or you can make another file. 38 | | 39 | */ 40 | 41 | $app->singleton( 42 | \Illuminate\Contracts\Debug\ExceptionHandler::class, 43 | \App\Exceptions\Handler::class 44 | ); 45 | 46 | $app->singleton( 47 | \Illuminate\Contracts\Console\Kernel::class, 48 | \App\Console\Kernel::class 49 | ); 50 | 51 | /* 52 | |-------------------------------------------------------------------------- 53 | | Register Config Files 54 | |-------------------------------------------------------------------------- 55 | | 56 | | Now we will register the "app" configuration file. If the file exists in 57 | | your configuration directory it will be loaded; otherwise, we'll load 58 | | the default version. You may register other files below as needed. 59 | | 60 | */ 61 | 62 | $app->configure('app'); 63 | 64 | /* 65 | |-------------------------------------------------------------------------- 66 | | Register Middleware 67 | |-------------------------------------------------------------------------- 68 | | 69 | | Next, we will register the middleware with the application. These can 70 | | be global middleware that run before and after each request into a 71 | | route or middleware that'll be assigned to some specific routes. 72 | | 73 | */ 74 | 75 | $app->middleware([ 76 | \Fruitcake\Cors\HandleCors::class, 77 | ]); 78 | 79 | $app->routeMiddleware([ 80 | 'auth' => \App\Http\Middleware\Authenticate::class, 81 | ]); 82 | 83 | /* 84 | |-------------------------------------------------------------------------- 85 | | Register Service Providers 86 | |-------------------------------------------------------------------------- 87 | | 88 | | Here we will register all of the application's service providers which 89 | | are used to bind services into the container. Service providers are 90 | | totally optional, so you are not required to uncomment this line. 91 | | 92 | */ 93 | 94 | // $app->register(App\Providers\AppServiceProvider::class); 95 | $app->register(\App\Providers\AuthServiceProvider::class); 96 | $app->register(\App\Providers\EventServiceProvider::class); 97 | $app->register(\Fruitcake\Cors\CorsServiceProvider::class); 98 | $app->register(\Spatie\Fractal\FractalServiceProvider::class); 99 | $app->register(\Spatie\QueryBuilder\QueryBuilderServiceProvider::class); 100 | $app->register(\Tymon\JWTAuth\Providers\LumenServiceProvider::class); 101 | 102 | if ('local' === $app->environment()) { 103 | $app->register(\Flipbox\LumenGenerator\LumenGeneratorServiceProvider::class); 104 | } 105 | 106 | /* 107 | |-------------------------------------------------------------------------- 108 | | Load The Application Routes 109 | |-------------------------------------------------------------------------- 110 | | 111 | | Next we will include the routes file so that they can all be added to 112 | | the application. This will provide all of the URLs the application 113 | | can respond to, as well as the controllers that may handle them. 114 | | 115 | */ 116 | 117 | $app->router->group([ 118 | 'namespace' => '\App\Http\Controllers', 119 | ], function ($router) { 120 | require __DIR__.'/../routes/web.php'; 121 | }); 122 | 123 | return $app; 124 | -------------------------------------------------------------------------------- /bootstrap/helpers.php: -------------------------------------------------------------------------------- 1 | basePath() . '/config' . ($path ? '/' . $path : $path); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/lumen", 3 | "description": "The Laravel Lumen Framework.", 4 | "keywords": [ 5 | "framework", 6 | "laravel", 7 | "lumen" 8 | ], 9 | "license": "MIT", 10 | "type": "project", 11 | "require": { 12 | "php": "^7.3|^8.0", 13 | "fruitcake/laravel-cors": "^2.0", 14 | "laravel/lumen-framework": "^8.2", 15 | "spatie/laravel-fractal": "^5.8", 16 | "spatie/laravel-query-builder": "^3.6", 17 | "tymon/jwt-auth": "^1.0" 18 | }, 19 | "require-dev": { 20 | "flipbox/lumen-generator": "^8.0", 21 | "fakerphp/faker": "^1.9.1", 22 | "mockery/mockery": "^1.3.1", 23 | "phpunit/phpunit": "^9.3" 24 | }, 25 | "autoload": { 26 | "psr-4": { 27 | "App\\": "app/", 28 | "Database\\Factories\\": "database/factories/", 29 | "Database\\Seeders\\": "database/seeders/", 30 | "Tests\\": "tests" 31 | }, 32 | "files": [ 33 | "bootstrap/helpers.php" 34 | ] 35 | }, 36 | "autoload-dev": { 37 | "classmap": [ 38 | "tests/" 39 | ] 40 | }, 41 | "scripts": { 42 | "post-root-package-install": [ 43 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 44 | ] 45 | }, 46 | "config": { 47 | "preferred-install": "dist", 48 | "sort-packages": true, 49 | "optimize-autoloader": true 50 | }, 51 | "minimum-stability": "dev", 52 | "prefer-stable": true 53 | } 54 | -------------------------------------------------------------------------------- /config/app.php: -------------------------------------------------------------------------------- 1 | env('APP_NAME', 'Lumen'), 17 | 18 | 'version' => env('APP_VERSION', 'unknown'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Application Environment 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This value determines the "environment" your application is currently 26 | | running in. This may determine how you prefer to configure various 27 | | services the application utilizes. Set this in your ".env" file. 28 | | 29 | */ 30 | 31 | 'env' => env('APP_ENV', 'production'), 32 | 33 | /* 34 | |-------------------------------------------------------------------------- 35 | | Application Debug Mode 36 | |-------------------------------------------------------------------------- 37 | | 38 | | When your application is in debug mode, detailed error messages with 39 | | stack traces will be shown on every error that occurs within your 40 | | application. If disabled, a simple generic error page is shown. 41 | | 42 | */ 43 | 44 | 'debug' => env('APP_DEBUG', false), 45 | 46 | /* 47 | |-------------------------------------------------------------------------- 48 | | Application URL 49 | |-------------------------------------------------------------------------- 50 | | 51 | | This URL is used by the console to properly generate URLs when using 52 | | the Artisan command line tool. You should set this to the root of 53 | | your application so that it is used when running Artisan tasks. 54 | | 55 | */ 56 | 57 | 'url' => env('APP_URL', 'http://localhost'), 58 | 59 | /* 60 | |-------------------------------------------------------------------------- 61 | | Application Timezone 62 | |-------------------------------------------------------------------------- 63 | | 64 | | Here you may specify the default timezone for your application, which 65 | | will be used by the PHP date and date-time functions. We have gone 66 | | ahead and set this to a sensible default for you out of the box. 67 | | 68 | */ 69 | 70 | 'timezone' => 'UTC', 71 | 72 | /* 73 | |-------------------------------------------------------------------------- 74 | | Application Locale Configuration 75 | |-------------------------------------------------------------------------- 76 | | 77 | | The application locale determines the default locale that will be used 78 | | by the translation service provider. You are free to set this value 79 | | to any of the locales which will be supported by the application. 80 | | 81 | */ 82 | 83 | 'locale' => env('APP_LOCALE', 'en'), 84 | 85 | /* 86 | |-------------------------------------------------------------------------- 87 | | Application Fallback Locale 88 | |-------------------------------------------------------------------------- 89 | | 90 | | The fallback locale determines the locale to use when the current one 91 | | is not available. You may change the value to correspond to any of 92 | | the language folders that are provided through your application. 93 | | 94 | */ 95 | 96 | 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), 97 | 98 | /* 99 | |-------------------------------------------------------------------------- 100 | | Encryption Key 101 | |-------------------------------------------------------------------------- 102 | | 103 | | This key is used by the Illuminate encrypter service and should be set 104 | | to a random, 32 character string, otherwise these encrypted strings 105 | | will not be safe. Please do this before deploying an application! 106 | | 107 | */ 108 | 109 | 'key' => env('APP_KEY'), 110 | 111 | 'cipher' => 'AES-256-CBC', 112 | 113 | ]; 114 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'guard' => env('AUTH_GUARD', 'api'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Authentication Guards 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Next, you may define every authentication guard for your application. 26 | | Of course, a great default configuration has been defined for you 27 | | here which uses session storage and the Eloquent user provider. 28 | | 29 | | All authentication drivers have a user provider. This defines how the 30 | | users are actually retrieved out of your database or other storage 31 | | mechanisms used by this application to persist your user's data. 32 | | 33 | | Supported: "token" 34 | | 35 | */ 36 | 37 | 'guards' => [ 38 | 'api' => [ 39 | 'driver' => 'jwt', 40 | 'provider' => 'users', 41 | ], 42 | ], 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | User Providers 47 | |-------------------------------------------------------------------------- 48 | | 49 | | All authentication drivers have a user provider. This defines how the 50 | | users are actually retrieved out of your database or other storage 51 | | mechanisms used by this application to persist your user's data. 52 | | 53 | | If you have multiple user tables or models you may configure multiple 54 | | sources which represent each model / table. These sources may then 55 | | be assigned to any extra authentication guards you have defined. 56 | | 57 | | Supported: "database", "eloquent" 58 | | 59 | */ 60 | 61 | 'providers' => [ 62 | 'users' => [ 63 | 'driver' => 'eloquent', 64 | 'model' => App\Models\User::class, 65 | ], 66 | ], 67 | 68 | /* 69 | |-------------------------------------------------------------------------- 70 | | Resetting Passwords 71 | |-------------------------------------------------------------------------- 72 | | 73 | | Here you may set the options for resetting passwords including the view 74 | | that is your password reset e-mail. You may also set the name of the 75 | | table that maintains all of the reset tokens for your application. 76 | | 77 | | You may specify multiple password reset configurations if you have more 78 | | than one user table or model in the application and you want to have 79 | | separate password reset settings based on the specific user types. 80 | | 81 | | The expire time is the number of minutes that the reset token should be 82 | | considered valid. This security feature keeps tokens short-lived so 83 | | they have less time to be guessed. You may change this as needed. 84 | | 85 | */ 86 | 87 | 'passwords' => [ 88 | // 89 | ], 90 | 91 | ]; 92 | -------------------------------------------------------------------------------- /config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | 'cluster' => env('PUSHER_APP_CLUSTER'), 40 | 'encrypted' => true, 41 | ], 42 | ], 43 | 44 | 'redis' => [ 45 | 'driver' => 'redis', 46 | 'connection' => env('BROADCAST_REDIS_CONNECTION', 'default'), 47 | ], 48 | 49 | 'log' => [ 50 | 'driver' => 'log', 51 | ], 52 | 53 | 'null' => [ 54 | 'driver' => 'null', 55 | ], 56 | 57 | ], 58 | 59 | ]; 60 | -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_DRIVER', 'file'), 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Cache Stores 25 | |-------------------------------------------------------------------------- 26 | | 27 | | Here you may define all of the cache "stores" for your application as 28 | | well as their drivers. You may even define multiple stores for the 29 | | same cache driver to group types of items stored in your caches. 30 | | 31 | */ 32 | 33 | 'stores' => [ 34 | 35 | 'apc' => [ 36 | 'driver' => 'apc', 37 | ], 38 | 39 | 'array' => [ 40 | 'driver' => 'array', 41 | ], 42 | 43 | 'database' => [ 44 | 'driver' => 'database', 45 | 'table' => env('CACHE_DATABASE_TABLE', 'cache'), 46 | 'connection' => env('CACHE_DATABASE_CONNECTION', null), 47 | ], 48 | 49 | 'file' => [ 50 | 'driver' => 'file', 51 | 'path' => storage_path('framework/cache/data'), 52 | ], 53 | 54 | 'memcached' => [ 55 | 'driver' => 'memcached', 56 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 57 | 'sasl' => [ 58 | env('MEMCACHED_USERNAME'), 59 | env('MEMCACHED_PASSWORD'), 60 | ], 61 | 'options' => [ 62 | // Memcached::OPT_CONNECT_TIMEOUT => 2000, 63 | ], 64 | 'servers' => [ 65 | [ 66 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 67 | 'port' => env('MEMCACHED_PORT', 11211), 68 | 'weight' => 100, 69 | ], 70 | ], 71 | ], 72 | 73 | 'redis' => [ 74 | 'driver' => 'redis', 75 | 'connection' => env('CACHE_REDIS_CONNECTION', 'default'), 76 | ], 77 | 78 | ], 79 | 80 | /* 81 | |-------------------------------------------------------------------------- 82 | | Cache Key Prefix 83 | |-------------------------------------------------------------------------- 84 | | 85 | | When utilizing a RAM based store such as APC or Memcached, there might 86 | | be other applications utilizing the same cache. So, we'll specify a 87 | | value to get prefixed to all our keys so we can avoid collisions. 88 | | 89 | */ 90 | 91 | 'prefix' => env( 92 | 'CACHE_PREFIX', 93 | Str::slug(env('APP_NAME', 'lumen'), '_').'_cache' 94 | ), 95 | 96 | ]; 97 | -------------------------------------------------------------------------------- /config/cors.php: -------------------------------------------------------------------------------- 1 | [], 25 | 26 | /* 27 | * Matches the request method. `[*]` allows all methods. 28 | */ 29 | 'allowed_methods' => ['*'], 30 | 31 | /* 32 | * Matches the request origin. `[*]` allows all origins. Wildcards can be used, eg `*.mydomain.com` 33 | */ 34 | 'allowed_origins' => ['*'], 35 | 36 | /* 37 | * Patterns that can be used with `preg_match` to match the origin. 38 | */ 39 | 'allowed_origins_patterns' => [], 40 | 41 | /* 42 | * Sets the Access-Control-Allow-Headers response header. `[*]` allows all headers. 43 | */ 44 | 'allowed_headers' => ['*'], 45 | 46 | /* 47 | * Sets the Access-Control-Expose-Headers response header with these headers. 48 | */ 49 | 'exposed_headers' => [], 50 | 51 | /* 52 | * Sets the Access-Control-Max-Age response header when > 0. 53 | */ 54 | 'max_age' => 0, 55 | 56 | /* 57 | * Sets the Access-Control-Allow-Credentials header. 58 | */ 59 | 'supports_credentials' => false, 60 | ]; 61 | -------------------------------------------------------------------------------- /config/database.php: -------------------------------------------------------------------------------- 1 | env('DB_CONNECTION', 'mysql'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Database Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here are each of the database connections setup for your application. 24 | | Of course, examples of configuring each database platform that is 25 | | supported by Laravel is shown below to make development simple. 26 | | 27 | | 28 | | All database work in Laravel is done through the PHP PDO facilities 29 | | so make sure you have the driver for your particular database of 30 | | choice installed on your machine before you begin development. 31 | | 32 | */ 33 | 34 | 'connections' => [ 35 | 36 | 'sqlite' => [ 37 | 'driver' => 'sqlite', 38 | 'database' => env('DB_DATABASE', database_path('database.sqlite')), 39 | 'prefix' => env('DB_PREFIX', ''), 40 | ], 41 | 42 | 'mysql' => [ 43 | 'driver' => 'mysql', 44 | 'host' => env('DB_HOST', '127.0.0.1'), 45 | 'port' => env('DB_PORT', 3306), 46 | 'database' => env('DB_DATABASE', 'forge'), 47 | 'username' => env('DB_USERNAME', 'forge'), 48 | 'password' => env('DB_PASSWORD', ''), 49 | 'unix_socket' => env('DB_SOCKET', ''), 50 | 'charset' => env('DB_CHARSET', 'utf8mb4'), 51 | 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 52 | 'prefix' => env('DB_PREFIX', ''), 53 | 'strict' => env('DB_STRICT_MODE', true), 54 | 'engine' => env('DB_ENGINE', null), 55 | 'timezone' => env('DB_TIMEZONE', '+00:00'), 56 | ], 57 | 58 | 'pgsql' => [ 59 | 'driver' => 'pgsql', 60 | 'host' => env('DB_HOST', '127.0.0.1'), 61 | 'port' => env('DB_PORT', 5432), 62 | 'database' => env('DB_DATABASE', 'forge'), 63 | 'username' => env('DB_USERNAME', 'forge'), 64 | 'password' => env('DB_PASSWORD', ''), 65 | 'charset' => env('DB_CHARSET', 'utf8'), 66 | 'prefix' => env('DB_PREFIX', ''), 67 | 'schema' => env('DB_SCHEMA', 'public'), 68 | 'sslmode' => env('DB_SSL_MODE', 'prefer'), 69 | ], 70 | 71 | 'sqlsrv' => [ 72 | 'driver' => 'sqlsrv', 73 | 'host' => env('DB_HOST', 'localhost'), 74 | 'port' => env('DB_PORT', 1433), 75 | 'database' => env('DB_DATABASE', 'forge'), 76 | 'username' => env('DB_USERNAME', 'forge'), 77 | 'password' => env('DB_PASSWORD', ''), 78 | 'charset' => env('DB_CHARSET', 'utf8'), 79 | 'prefix' => env('DB_PREFIX', ''), 80 | ], 81 | 82 | ], 83 | 84 | /* 85 | |-------------------------------------------------------------------------- 86 | | Migration Repository Table 87 | |-------------------------------------------------------------------------- 88 | | 89 | | This table keeps track of all the migrations that have already run for 90 | | your application. Using this information, we can determine which of 91 | | the migrations on disk haven't actually been run in the database. 92 | | 93 | */ 94 | 95 | 'migrations' => 'migrations', 96 | 97 | /* 98 | |-------------------------------------------------------------------------- 99 | | Redis Databases 100 | |-------------------------------------------------------------------------- 101 | | 102 | | Redis is an open source, fast, and advanced key-value store that also 103 | | provides a richer set of commands than a typical key-value systems 104 | | such as APC or Memcached. Laravel makes it easy to dig right in. 105 | | 106 | */ 107 | 108 | 'redis' => [ 109 | 110 | 'client' => env('REDIS_CLIENT', 'phpredis'), 111 | 112 | 'cluster' => env('REDIS_CLUSTER', false), 113 | 114 | 'default' => [ 115 | 'host' => env('REDIS_HOST', '127.0.0.1'), 116 | 'password' => env('REDIS_PASSWORD', null), 117 | 'port' => env('REDIS_PORT', 6379), 118 | 'database' => env('REDIS_DB', 0), 119 | ], 120 | 121 | 'cache' => [ 122 | 'host' => env('REDIS_HOST', '127.0.0.1'), 123 | 'password' => env('REDIS_PASSWORD', null), 124 | 'port' => env('REDIS_PORT', 6379), 125 | 'database' => env('REDIS_CACHE_DB', 1), 126 | ], 127 | 128 | ], 129 | 130 | ]; 131 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DRIVER', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Default Cloud Filesystem Disk 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Many applications store files both locally and in the cloud. For this 24 | | reason, you may specify a default "cloud" driver here. This driver 25 | | will be bound as the Cloud disk implementation in the container. 26 | | 27 | */ 28 | 29 | 'cloud' => env('FILESYSTEM_CLOUD', 's3'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Filesystem Disks 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may configure as many filesystem "disks" as you wish, and you 37 | | may even configure multiple disks of the same driver. Defaults have 38 | | been setup for each driver as an example of the required options. 39 | | 40 | | Supported Drivers: "local", "ftp", "sftp", "s3", "rackspace" 41 | | 42 | */ 43 | 44 | 'disks' => [ 45 | 46 | 'local' => [ 47 | 'driver' => 'local', 48 | 'root' => storage_path('app'), 49 | ], 50 | 51 | 'public' => [ 52 | 'driver' => 'local', 53 | 'root' => storage_path('app/public'), 54 | 'url' => env('APP_URL').'/storage', 55 | 'visibility' => 'public', 56 | ], 57 | 58 | 's3' => [ 59 | 'driver' => 's3', 60 | 'key' => env('AWS_ACCESS_KEY_ID'), 61 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 62 | 'region' => env('AWS_DEFAULT_REGION'), 63 | 'bucket' => env('AWS_BUCKET'), 64 | 'url' => env('AWS_URL'), 65 | ], 66 | 67 | ], 68 | 69 | ]; 70 | -------------------------------------------------------------------------------- /config/fractal.php: -------------------------------------------------------------------------------- 1 | '', 10 | 11 | /* The default paginator to be used when performing a transformation. It 12 | * may be left empty to use Fractal's default one. This can either be a 13 | * string or a League\Fractal\Paginator\PaginatorInterface subclass. 14 | */ 15 | 'default_paginator' => '', 16 | 17 | /* 18 | * League\Fractal\Serializer\JsonApiSerializer will use this value to 19 | * as a prefix for generated links. Set to `null` to disable this. 20 | */ 21 | 'base_url' => null, 22 | 23 | /* 24 | * If you wish to override or extend the default Spatie\Fractal\Fractal 25 | * instance provide the name of the class you want to use. 26 | */ 27 | 'fractal_class' => Spatie\Fractal\Fractal::class, 28 | 29 | 'auto_includes' => [ 30 | 31 | /* 32 | * If enabled Fractal will automatically add the includes who's 33 | * names are present in the `include` request parameter. 34 | */ 35 | 'enabled' => true, 36 | 37 | /* 38 | * The name of key in the request to where we should look for the includes to include. 39 | */ 40 | 'request_key' => 'include', 41 | ], 42 | ]; 43 | -------------------------------------------------------------------------------- /config/jwt.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | return [ 13 | 14 | /* 15 | |-------------------------------------------------------------------------- 16 | | JWT Authentication Secret 17 | |-------------------------------------------------------------------------- 18 | | 19 | | Don't forget to set this in your .env file, as it will be used to sign 20 | | your tokens. A helper command is provided for this: 21 | | `php artisan jwt:secret` 22 | | 23 | | Note: This will be used for Symmetric algorithms only (HMAC), 24 | | since RSA and ECDSA use a private/public key combo (See below). 25 | | 26 | */ 27 | 28 | 'secret' => env('JWT_SECRET'), 29 | 30 | /* 31 | |-------------------------------------------------------------------------- 32 | | JWT Authentication Keys 33 | |-------------------------------------------------------------------------- 34 | | 35 | | The algorithm you are using, will determine whether your tokens are 36 | | signed with a random string (defined in `JWT_SECRET`) or using the 37 | | following public & private keys. 38 | | 39 | | Symmetric Algorithms: 40 | | HS256, HS384 & HS512 will use `JWT_SECRET`. 41 | | 42 | | Asymmetric Algorithms: 43 | | RS256, RS384 & RS512 / ES256, ES384 & ES512 will use the keys below. 44 | | 45 | */ 46 | 47 | 'keys' => [ 48 | 49 | /* 50 | |-------------------------------------------------------------------------- 51 | | Public Key 52 | |-------------------------------------------------------------------------- 53 | | 54 | | A path or resource to your public key. 55 | | 56 | | E.g. 'file://path/to/public/key' 57 | | 58 | */ 59 | 60 | 'public' => env('JWT_PUBLIC_KEY'), 61 | 62 | /* 63 | |-------------------------------------------------------------------------- 64 | | Private Key 65 | |-------------------------------------------------------------------------- 66 | | 67 | | A path or resource to your private key. 68 | | 69 | | E.g. 'file://path/to/private/key' 70 | | 71 | */ 72 | 73 | 'private' => env('JWT_PRIVATE_KEY'), 74 | 75 | /* 76 | |-------------------------------------------------------------------------- 77 | | Passphrase 78 | |-------------------------------------------------------------------------- 79 | | 80 | | The passphrase for your private key. Can be null if none set. 81 | | 82 | */ 83 | 84 | 'passphrase' => env('JWT_PASSPHRASE'), 85 | 86 | ], 87 | 88 | /* 89 | |-------------------------------------------------------------------------- 90 | | JWT time to live 91 | |-------------------------------------------------------------------------- 92 | | 93 | | Specify the length of time (in minutes) that the token will be valid for. 94 | | Defaults to 1 hour. 95 | | 96 | | You can also set this to null, to yield a never expiring token. 97 | | Some people may want this behaviour for e.g. a mobile app. 98 | | This is not particularly recommended, so make sure you have appropriate 99 | | systems in place to revoke the token if necessary. 100 | | Notice: If you set this to null you should remove 'exp' element from 'required_claims' list. 101 | | 102 | */ 103 | 104 | 'ttl' => env('JWT_TTL', 60), 105 | 106 | /* 107 | |-------------------------------------------------------------------------- 108 | | Refresh time to live 109 | |-------------------------------------------------------------------------- 110 | | 111 | | Specify the length of time (in minutes) that the token can be refreshed 112 | | within. I.E. The user can refresh their token within a 2 week window of 113 | | the original token being created until they must re-authenticate. 114 | | Defaults to 2 weeks. 115 | | 116 | | You can also set this to null, to yield an infinite refresh time. 117 | | Some may want this instead of never expiring tokens for e.g. a mobile app. 118 | | This is not particularly recommended, so make sure you have appropriate 119 | | systems in place to revoke the token if necessary. 120 | | 121 | */ 122 | 123 | 'refresh_ttl' => env('JWT_REFRESH_TTL', 20160), 124 | 125 | /* 126 | |-------------------------------------------------------------------------- 127 | | JWT hashing algorithm 128 | |-------------------------------------------------------------------------- 129 | | 130 | | Specify the hashing algorithm that will be used to sign the token. 131 | | 132 | | See here: https://github.com/namshi/jose/tree/master/src/Namshi/JOSE/Signer/OpenSSL 133 | | for possible values. 134 | | 135 | */ 136 | 137 | 'algo' => env('JWT_ALGO', 'HS256'), 138 | 139 | /* 140 | |-------------------------------------------------------------------------- 141 | | Required Claims 142 | |-------------------------------------------------------------------------- 143 | | 144 | | Specify the required claims that must exist in any token. 145 | | A TokenInvalidException will be thrown if any of these claims are not 146 | | present in the payload. 147 | | 148 | */ 149 | 150 | 'required_claims' => [ 151 | 'iss', 152 | 'iat', 153 | 'exp', 154 | 'nbf', 155 | 'sub', 156 | 'jti', 157 | ], 158 | 159 | /* 160 | |-------------------------------------------------------------------------- 161 | | Persistent Claims 162 | |-------------------------------------------------------------------------- 163 | | 164 | | Specify the claim keys to be persisted when refreshing a token. 165 | | `sub` and `iat` will automatically be persisted, in 166 | | addition to the these claims. 167 | | 168 | | Note: If a claim does not exist then it will be ignored. 169 | | 170 | */ 171 | 172 | 'persistent_claims' => [ 173 | // 'foo', 174 | // 'bar', 175 | ], 176 | 177 | /* 178 | |-------------------------------------------------------------------------- 179 | | Lock Subject 180 | |-------------------------------------------------------------------------- 181 | | 182 | | This will determine whether a `prv` claim is automatically added to 183 | | the token. The purpose of this is to ensure that if you have multiple 184 | | authentication models e.g. `App\User` & `App\OtherPerson`, then we 185 | | should prevent one authentication request from impersonating another, 186 | | if 2 tokens happen to have the same id across the 2 different models. 187 | | 188 | | Under specific circumstances, you may want to disable this behaviour 189 | | e.g. if you only have one authentication model, then you would save 190 | | a little on token size. 191 | | 192 | */ 193 | 194 | 'lock_subject' => true, 195 | 196 | /* 197 | |-------------------------------------------------------------------------- 198 | | Leeway 199 | |-------------------------------------------------------------------------- 200 | | 201 | | This property gives the jwt timestamp claims some "leeway". 202 | | Meaning that if you have any unavoidable slight clock skew on 203 | | any of your servers then this will afford you some level of cushioning. 204 | | 205 | | This applies to the claims `iat`, `nbf` and `exp`. 206 | | 207 | | Specify in seconds - only if you know you need it. 208 | | 209 | */ 210 | 211 | 'leeway' => env('JWT_LEEWAY', 0), 212 | 213 | /* 214 | |-------------------------------------------------------------------------- 215 | | Blacklist Enabled 216 | |-------------------------------------------------------------------------- 217 | | 218 | | In order to invalidate tokens, you must have the blacklist enabled. 219 | | If you do not want or need this functionality, then set this to false. 220 | | 221 | */ 222 | 223 | 'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true), 224 | 225 | /* 226 | | ------------------------------------------------------------------------- 227 | | Blacklist Grace Period 228 | | ------------------------------------------------------------------------- 229 | | 230 | | When multiple concurrent requests are made with the same JWT, 231 | | it is possible that some of them fail, due to token regeneration 232 | | on every request. 233 | | 234 | | Set grace period in seconds to prevent parallel request failure. 235 | | 236 | */ 237 | 238 | 'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 0), 239 | 240 | /* 241 | |-------------------------------------------------------------------------- 242 | | Cookies encryption 243 | |-------------------------------------------------------------------------- 244 | | 245 | | By default Laravel encrypt cookies for security reason. 246 | | If you decide to not decrypt cookies, you will have to configure Laravel 247 | | to not encrypt your cookie token by adding its name into the $except 248 | | array available in the middleware "EncryptCookies" provided by Laravel. 249 | | see https://laravel.com/docs/master/responses#cookies-and-encryption 250 | | for details. 251 | | 252 | | Set it to true if you want to decrypt cookies. 253 | | 254 | */ 255 | 256 | 'decrypt_cookies' => false, 257 | 258 | /* 259 | |-------------------------------------------------------------------------- 260 | | Providers 261 | |-------------------------------------------------------------------------- 262 | | 263 | | Specify the various providers used throughout the package. 264 | | 265 | */ 266 | 267 | 'providers' => [ 268 | 269 | /* 270 | |-------------------------------------------------------------------------- 271 | | JWT Provider 272 | |-------------------------------------------------------------------------- 273 | | 274 | | Specify the provider that is used to create and decode the tokens. 275 | | 276 | */ 277 | 278 | 'jwt' => Tymon\JWTAuth\Providers\JWT\Lcobucci::class, 279 | 280 | /* 281 | |-------------------------------------------------------------------------- 282 | | Authentication Provider 283 | |-------------------------------------------------------------------------- 284 | | 285 | | Specify the provider that is used to authenticate users. 286 | | 287 | */ 288 | 289 | 'auth' => Tymon\JWTAuth\Providers\Auth\Illuminate::class, 290 | 291 | /* 292 | |-------------------------------------------------------------------------- 293 | | Storage Provider 294 | |-------------------------------------------------------------------------- 295 | | 296 | | Specify the provider that is used to store tokens in the blacklist. 297 | | 298 | */ 299 | 300 | 'storage' => Tymon\JWTAuth\Providers\Storage\Illuminate::class, 301 | 302 | ], 303 | 304 | ]; 305 | -------------------------------------------------------------------------------- /config/logging.php: -------------------------------------------------------------------------------- 1 | env('LOG_CHANNEL', 'stack'), 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Log Channels 25 | |-------------------------------------------------------------------------- 26 | | 27 | | Here you may configure the log channels for your application. Out of 28 | | the box, Laravel uses the Monolog PHP logging library. This gives 29 | | you a variety of powerful log handlers / formatters to utilize. 30 | | 31 | | Available Drivers: "single", "daily", "slack", "syslog", 32 | | "errorlog", "monolog", 33 | | "custom", "stack" 34 | | 35 | */ 36 | 37 | 'channels' => [ 38 | 'stack' => [ 39 | 'driver' => 'stack', 40 | 'channels' => ['daily'], 41 | ], 42 | 43 | 'single' => [ 44 | 'driver' => 'single', 45 | 'path' => storage_path('logs/lumen.log'), 46 | 'level' => 'debug', 47 | ], 48 | 49 | 'daily' => [ 50 | 'driver' => 'daily', 51 | 'path' => storage_path('logs/lumen.log'), 52 | 'level' => 'debug', 53 | 'days' => 14, 54 | ], 55 | 56 | 'slack' => [ 57 | 'driver' => 'slack', 58 | 'url' => env('LOG_SLACK_WEBHOOK_URL'), 59 | 'username' => 'Lumen Log', 60 | 'emoji' => ':boom:', 61 | 'level' => 'critical', 62 | ], 63 | 64 | 'papertrail' => [ 65 | 'driver' => 'monolog', 66 | 'level' => 'debug', 67 | 'handler' => SyslogUdpHandler::class, 68 | 'handler_with' => [ 69 | 'host' => env('PAPERTRAIL_URL'), 70 | 'port' => env('PAPERTRAIL_PORT'), 71 | ], 72 | ], 73 | 74 | 'stderr' => [ 75 | 'driver' => 'monolog', 76 | 'handler' => StreamHandler::class, 77 | 'with' => [ 78 | 'stream' => 'php://stderr', 79 | ], 80 | ], 81 | 82 | 'syslog' => [ 83 | 'driver' => 'syslog', 84 | 'level' => 'debug', 85 | ], 86 | 87 | 'errorlog' => [ 88 | 'driver' => 'errorlog', 89 | 'level' => 'debug', 90 | ], 91 | 92 | 'null' => [ 93 | 'driver' => 'monolog', 94 | 'handler' => NullHandler::class, 95 | ], 96 | ], 97 | 98 | ]; 99 | -------------------------------------------------------------------------------- /config/query-builder.php: -------------------------------------------------------------------------------- 1 | [ 15 | 'include' => 'include', 16 | 17 | 'filter' => 'filter', 18 | 19 | 'sort' => 'sort', 20 | 21 | 'fields' => 'fields', 22 | 23 | 'append' => 'append', 24 | ], 25 | 26 | /* 27 | * Related model counts are included using the relationship name suffixed with this string. 28 | * For example: GET /users?include=postsCount 29 | */ 30 | 'count_suffix' => 'Count', 31 | 32 | ]; 33 | -------------------------------------------------------------------------------- /config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_CONNECTION', 'sync'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Queue Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure the connection information for each server that 24 | | is used by your application. A default configuration has been added 25 | | for each back-end shipped with Lumen. You are free to add more. 26 | | 27 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'sync' => [ 34 | 'driver' => 'sync', 35 | ], 36 | 37 | 'database' => [ 38 | 'driver' => 'database', 39 | 'table' => env('QUEUE_TABLE', 'jobs'), 40 | 'queue' => 'default', 41 | 'retry_after' => 90, 42 | ], 43 | 44 | 'beanstalkd' => [ 45 | 'driver' => 'beanstalkd', 46 | 'host' => 'localhost', 47 | 'queue' => 'default', 48 | 'retry_after' => 90, 49 | ], 50 | 51 | 'sqs' => [ 52 | 'driver' => 'sqs', 53 | 'key' => env('SQS_KEY', 'your-public-key'), 54 | 'secret' => env('SQS_SECRET', 'your-secret-key'), 55 | 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 56 | 'queue' => env('SQS_QUEUE', 'your-queue-name'), 57 | 'region' => env('SQS_REGION', 'us-east-1'), 58 | ], 59 | 60 | 'redis' => [ 61 | 'driver' => 'redis', 62 | 'connection' => env('QUEUE_REDIS_CONNECTION', 'default'), 63 | 'queue' => 'default', 64 | 'retry_after' => 90, 65 | 'block_for' => null, 66 | ], 67 | 68 | ], 69 | 70 | /* 71 | |-------------------------------------------------------------------------- 72 | | Failed Queue Jobs 73 | |-------------------------------------------------------------------------- 74 | | 75 | | These options configure the behavior of failed queue job logging so you 76 | | can control which database and table are used to store the jobs that 77 | | have failed. You may change them to any database / table you wish. 78 | | 79 | */ 80 | 81 | 'failed' => [ 82 | 'database' => env('DB_CONNECTION', 'mysql'), 83 | 'table' => env('QUEUE_FAILED_TABLE', 'failed_jobs'), 84 | ], 85 | 86 | ]; 87 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), 21 | ], 22 | 23 | 'ses' => [ 24 | 'key' => env('SES_KEY'), 25 | 'secret' => env('SES_SECRET'), 26 | 'region' => env('SES_REGION', 'us-east-1'), 27 | ], 28 | 29 | 'sparkpost' => [ 30 | 'secret' => env('SPARKPOST_SECRET'), 31 | ], 32 | 33 | 'stripe' => [ 34 | 'model' => App\Models\User::class, 35 | 'key' => env('STRIPE_KEY'), 36 | 'secret' => env('STRIPE_SECRET'), 37 | 'webhook' => [ 38 | 'secret' => env('STRIPE_WEBHOOK_SECRET'), 39 | 'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300), 40 | ], 41 | ], 42 | 43 | ]; 44 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => realpath(storage_path('framework/views')), 32 | 33 | ]; 34 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->name(), 26 | 'email' => $this->faker->unique()->safeEmail(), 27 | 'password' => 'password', 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /database/migrations/2018_12_25_085051_create_users_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('email')->unique(); 19 | $table->string('name'); 20 | $table->string('password'); 21 | $table->dateTime('email_verified_at')->nullable(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('users'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call('UsersTableSeeder'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /database/seeds/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call('UsersTableSeeder'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /docker-compose.local.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | 3 | services: 4 | app: 5 | volumes: 6 | - .:/var/www/html 7 | - ./docker/php/php.ini:/usr/local/etc/php/php.ini 8 | 9 | server: 10 | volumes: 11 | - .:/var/www/html 12 | - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf 13 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | 3 | services: 4 | app: 5 | build: 6 | context: . 7 | dockerfile: Dockerfile 8 | image: lumen-api-starter-app 9 | container_name: lumen-api-starter-app 10 | volumes: 11 | - app-data:/var/www/html 12 | - ./docker/php/php.ini:/usr/local/etc/php/php.ini 13 | depends_on: 14 | - db 15 | 16 | server: 17 | image: nginx:1-alpine 18 | container_name: lumen-api-starter-server 19 | ports: 20 | - 8000:80 21 | volumes: 22 | - app-data:/var/www/html 23 | - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf 24 | depends_on: 25 | - app 26 | 27 | db: 28 | image: mysql:8 29 | container_name: lumen-api-starter-db 30 | command: --default-authentication-plugin=mysql_native_password 31 | ports: 32 | - 33061:3306 33 | environment: 34 | MYSQL_DATABASE: lumen-api-starter 35 | MYSQL_USER: user 36 | MYSQL_PASSWORD: secret 37 | MYSQL_ROOT_PASSWORD: root 38 | volumes: 39 | - db-data:/var/lib/mysql 40 | - ./docker/mysql/my.cnf:/etc/mysql/my.cnf 41 | - ./docker/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf 42 | 43 | volumes: 44 | db-data: 45 | app-data: 46 | -------------------------------------------------------------------------------- /docker/mysql/my.cnf: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. 2 | # 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License as published by 5 | # the Free Software Foundation; version 2 of the License. 6 | # 7 | # This program is distributed in the hope that it will be useful, 8 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 9 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 | # GNU General Public License for more details. 11 | # 12 | # You should have received a copy of the GNU General Public License 13 | # along with this program; if not, write to the Free Software 14 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 15 | 16 | # 17 | # The MySQL Server configuration file. 18 | # 19 | # For explanations see 20 | # http://dev.mysql.com/doc/mysql/en/server-system-variables.html 21 | 22 | [mysqld] 23 | pid-file = /var/run/mysqld/mysqld.pid 24 | socket = /var/run/mysqld/mysqld.sock 25 | datadir = /var/lib/mysql 26 | secure-file-priv= NULL 27 | # Disabling symbolic-links is recommended to prevent assorted security risks 28 | symbolic-links=0 29 | 30 | # Custom config should go here 31 | !includedir /etc/mysql/conf.d/ 32 | -------------------------------------------------------------------------------- /docker/mysql/mysql.cnf: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. 2 | # 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License, version 2.0, 5 | # as published by the Free Software Foundation. 6 | # 7 | # This program is also distributed with certain software (including 8 | # but not limited to OpenSSL) that is licensed under separate terms, 9 | # as designated in a particular file or component or in included license 10 | # documentation. The authors of MySQL hereby grant you an additional 11 | # permission to link the program and your derivative works with the 12 | # separately licensed software that they have included with MySQL. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License, version 2.0, for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with this program; if not, write to the Free Software 21 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 22 | 23 | # 24 | # The MySQL Client configuration file. 25 | # 26 | # For explanations see 27 | # http://dev.mysql.com/doc/mysql/en/server-system-variables.html 28 | 29 | [mysql] 30 | -------------------------------------------------------------------------------- /docker/nginx/default.conf: -------------------------------------------------------------------------------- 1 | # Reference: https://laravel.com/docs/7.x/deployment#nginx 2 | server { 3 | listen 80; 4 | listen [::]:80; 5 | 6 | server_name localhost; 7 | 8 | root /var/www/html/public; 9 | 10 | # add_header X-Frame-Options "SAMEORIGIN"; 11 | # add_header X-XSS-Protection "1; mode=block"; 12 | # add_header X-Content-Type-Options "nosniff"; 13 | 14 | index index.html index.htm index.php; 15 | 16 | charset utf-8; 17 | 18 | error_log /var/log/nginx/error.log; 19 | access_log /var/log/nginx/access.log; 20 | 21 | location / { 22 | try_files $uri $uri/ /index.php?$query_string; 23 | gzip_static on; 24 | } 25 | 26 | location = /favicon.ico { access_log off; log_not_found off; } 27 | location = /robots.txt { access_log off; log_not_found off; } 28 | 29 | error_page 404 /index.php; 30 | 31 | location ~ \.php$ { 32 | fastcgi_pass app:9000; 33 | fastcgi_index index.php; 34 | fastcgi_split_path_info ^(.+\.php)(/.+)$; 35 | include fastcgi_params; 36 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 37 | fastcgi_param PATH_INFO $fastcgi_path_info; 38 | } 39 | 40 | location ~ /\.(?!well-known).* { 41 | deny all; 42 | } 43 | } 44 | 45 | -------------------------------------------------------------------------------- /docker/php/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | 3 | ;;;;;;;;;;;;;;;;;;; 4 | ; About php.ini ; 5 | ;;;;;;;;;;;;;;;;;;; 6 | ; PHP's initialization file, generally called php.ini, is responsible for 7 | ; configuring many of the aspects of PHP's behavior. 8 | 9 | ; PHP attempts to find and load this configuration from a number of locations. 10 | ; The following is a summary of its search order: 11 | ; 1. SAPI module specific location. 12 | ; 2. The PHPRC environment variable. (As of PHP 5.2.0) 13 | ; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) 14 | ; 4. Current working directory (except CLI) 15 | ; 5. The web server's directory (for SAPI modules), or directory of PHP 16 | ; (otherwise in Windows) 17 | ; 6. The directory from the --with-config-file-path compile time option, or the 18 | ; Windows directory (usually C:\windows) 19 | ; See the PHP docs for more specific information. 20 | ; http://php.net/configuration.file 21 | 22 | ; The syntax of the file is extremely simple. Whitespace and lines 23 | ; beginning with a semicolon are silently ignored (as you probably guessed). 24 | ; Section headers (e.g. [Foo]) are also silently ignored, even though 25 | ; they might mean something in the future. 26 | 27 | ; Directives following the section heading [PATH=/www/mysite] only 28 | ; apply to PHP files in the /www/mysite directory. Directives 29 | ; following the section heading [HOST=www.example.com] only apply to 30 | ; PHP files served from www.example.com. Directives set in these 31 | ; special sections cannot be overridden by user-defined INI files or 32 | ; at runtime. Currently, [PATH=] and [HOST=] sections only work under 33 | ; CGI/FastCGI. 34 | ; http://php.net/ini.sections 35 | 36 | ; Directives are specified using the following syntax: 37 | ; directive = value 38 | ; Directive names are *case sensitive* - foo=bar is different from FOO=bar. 39 | ; Directives are variables used to configure PHP or PHP extensions. 40 | ; There is no name validation. If PHP can't find an expected 41 | ; directive because it is not set or is mistyped, a default value will be used. 42 | 43 | ; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one 44 | ; of the INI constants (On, Off, True, False, Yes, No and None) or an expression 45 | ; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a 46 | ; previously set variable or directive (e.g. ${foo}) 47 | 48 | ; Expressions in the INI file are limited to bitwise operators and parentheses: 49 | ; | bitwise OR 50 | ; ^ bitwise XOR 51 | ; & bitwise AND 52 | ; ~ bitwise NOT 53 | ; ! boolean NOT 54 | 55 | ; Boolean flags can be turned on using the values 1, On, True or Yes. 56 | ; They can be turned off using the values 0, Off, False or No. 57 | 58 | ; An empty string can be denoted by simply not writing anything after the equal 59 | ; sign, or by using the None keyword: 60 | 61 | ; foo = ; sets foo to an empty string 62 | ; foo = None ; sets foo to an empty string 63 | ; foo = "None" ; sets foo to the string 'None' 64 | 65 | ; If you use constants in your value, and these constants belong to a 66 | ; dynamically loaded extension (either a PHP extension or a Zend extension), 67 | ; you may only use these constants *after* the line that loads the extension. 68 | 69 | ;;;;;;;;;;;;;;;;;;; 70 | ; About this file ; 71 | ;;;;;;;;;;;;;;;;;;; 72 | ; PHP comes packaged with two INI files. One that is recommended to be used 73 | ; in production environments and one that is recommended to be used in 74 | ; development environments. 75 | 76 | ; php.ini-production contains settings which hold security, performance and 77 | ; best practices at its core. But please be aware, these settings may break 78 | ; compatibility with older or less security conscience applications. We 79 | ; recommending using the production ini in production and testing environments. 80 | 81 | ; php.ini-development is very similar to its production variant, except it is 82 | ; much more verbose when it comes to errors. We recommend using the 83 | ; development version only in development environments, as errors shown to 84 | ; application users can inadvertently leak otherwise secure information. 85 | 86 | ; This is the php.ini-production INI file. 87 | 88 | ;;;;;;;;;;;;;;;;;;; 89 | ; Quick Reference ; 90 | ;;;;;;;;;;;;;;;;;;; 91 | ; The following are all the settings which are different in either the production 92 | ; or development versions of the INIs with respect to PHP's default behavior. 93 | ; Please see the actual settings later in the document for more details as to why 94 | ; we recommend these changes in PHP's behavior. 95 | 96 | ; display_errors 97 | ; Default Value: On 98 | ; Development Value: On 99 | ; Production Value: Off 100 | 101 | ; display_startup_errors 102 | ; Default Value: Off 103 | ; Development Value: On 104 | ; Production Value: Off 105 | 106 | ; error_reporting 107 | ; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 108 | ; Development Value: E_ALL 109 | ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT 110 | 111 | ; log_errors 112 | ; Default Value: Off 113 | ; Development Value: On 114 | ; Production Value: On 115 | 116 | ; max_input_time 117 | ; Default Value: -1 (Unlimited) 118 | ; Development Value: 60 (60 seconds) 119 | ; Production Value: 60 (60 seconds) 120 | 121 | ; output_buffering 122 | ; Default Value: Off 123 | ; Development Value: 4096 124 | ; Production Value: 4096 125 | 126 | ; register_argc_argv 127 | ; Default Value: On 128 | ; Development Value: Off 129 | ; Production Value: Off 130 | 131 | ; request_order 132 | ; Default Value: None 133 | ; Development Value: "GP" 134 | ; Production Value: "GP" 135 | 136 | ; session.gc_divisor 137 | ; Default Value: 100 138 | ; Development Value: 1000 139 | ; Production Value: 1000 140 | 141 | ; session.sid_bits_per_character 142 | ; Default Value: 4 143 | ; Development Value: 5 144 | ; Production Value: 5 145 | 146 | ; short_open_tag 147 | ; Default Value: On 148 | ; Development Value: Off 149 | ; Production Value: Off 150 | 151 | ; variables_order 152 | ; Default Value: "EGPCS" 153 | ; Development Value: "GPCS" 154 | ; Production Value: "GPCS" 155 | 156 | ;;;;;;;;;;;;;;;;;;;; 157 | ; php.ini Options ; 158 | ;;;;;;;;;;;;;;;;;;;; 159 | ; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" 160 | ;user_ini.filename = ".user.ini" 161 | 162 | ; To disable this feature set this option to an empty value 163 | ;user_ini.filename = 164 | 165 | ; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) 166 | ;user_ini.cache_ttl = 300 167 | 168 | ;;;;;;;;;;;;;;;;;;;; 169 | ; Language Options ; 170 | ;;;;;;;;;;;;;;;;;;;; 171 | 172 | ; Enable the PHP scripting language engine under Apache. 173 | ; http://php.net/engine 174 | engine = On 175 | 176 | ; This directive determines whether or not PHP will recognize code between 177 | ; tags as PHP source which should be processed as such. It is 178 | ; generally recommended that should be used and that this feature 179 | ; should be disabled, as enabling it may result in issues when generating XML 180 | ; documents, however this remains supported for backward compatibility reasons. 181 | ; Note that this directive does not control the would work. 321 | ; http://php.net/syntax-highlighting 322 | ;highlight.string = #DD0000 323 | ;highlight.comment = #FF9900 324 | ;highlight.keyword = #007700 325 | ;highlight.default = #0000BB 326 | ;highlight.html = #000000 327 | 328 | ; If enabled, the request will be allowed to complete even if the user aborts 329 | ; the request. Consider enabling it if executing long requests, which may end up 330 | ; being interrupted by the user or a browser timing out. PHP's default behavior 331 | ; is to disable this feature. 332 | ; http://php.net/ignore-user-abort 333 | ;ignore_user_abort = On 334 | 335 | ; Determines the size of the realpath cache to be used by PHP. This value should 336 | ; be increased on systems where PHP opens many files to reflect the quantity of 337 | ; the file operations performed. 338 | ; Note: if open_basedir is set, the cache is disabled 339 | ; http://php.net/realpath-cache-size 340 | ;realpath_cache_size = 4096k 341 | 342 | ; Duration of time, in seconds for which to cache realpath information for a given 343 | ; file or directory. For systems with rarely changing files, consider increasing this 344 | ; value. 345 | ; http://php.net/realpath-cache-ttl 346 | ;realpath_cache_ttl = 120 347 | 348 | ; Enables or disables the circular reference collector. 349 | ; http://php.net/zend.enable-gc 350 | zend.enable_gc = On 351 | 352 | ; If enabled, scripts may be written in encodings that are incompatible with 353 | ; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such 354 | ; encodings. To use this feature, mbstring extension must be enabled. 355 | ; Default: Off 356 | ;zend.multibyte = Off 357 | 358 | ; Allows to set the default encoding for the scripts. This value will be used 359 | ; unless "declare(encoding=...)" directive appears at the top of the script. 360 | ; Only affects if zend.multibyte is set. 361 | ; Default: "" 362 | ;zend.script_encoding = 363 | 364 | ; Allows to include or exclude arguments from stack traces generated for exceptions 365 | ; Default: Off 366 | ; In production, it is recommended to turn this setting on to prohibit the output 367 | ; of sensitive information in stack traces 368 | zend.exception_ignore_args = On 369 | 370 | ;;;;;;;;;;;;;;;;; 371 | ; Miscellaneous ; 372 | ;;;;;;;;;;;;;;;;; 373 | 374 | ; Decides whether PHP may expose the fact that it is installed on the server 375 | ; (e.g. by adding its signature to the Web server header). It is no security 376 | ; threat in any way, but it makes it possible to determine whether you use PHP 377 | ; on your server or not. 378 | ; http://php.net/expose-php 379 | expose_php = On 380 | 381 | ;;;;;;;;;;;;;;;;;;; 382 | ; Resource Limits ; 383 | ;;;;;;;;;;;;;;;;;;; 384 | 385 | ; Maximum execution time of each script, in seconds 386 | ; http://php.net/max-execution-time 387 | ; Note: This directive is hardcoded to 0 for the CLI SAPI 388 | max_execution_time = 30 389 | 390 | ; Maximum amount of time each script may spend parsing request data. It's a good 391 | ; idea to limit this time on productions servers in order to eliminate unexpectedly 392 | ; long running scripts. 393 | ; Note: This directive is hardcoded to -1 for the CLI SAPI 394 | ; Default Value: -1 (Unlimited) 395 | ; Development Value: 60 (60 seconds) 396 | ; Production Value: 60 (60 seconds) 397 | ; http://php.net/max-input-time 398 | max_input_time = 60 399 | 400 | ; Maximum input variable nesting level 401 | ; http://php.net/max-input-nesting-level 402 | ;max_input_nesting_level = 64 403 | 404 | ; How many GET/POST/COOKIE input variables may be accepted 405 | ;max_input_vars = 1000 406 | 407 | ; Maximum amount of memory a script may consume (128MB) 408 | ; http://php.net/memory-limit 409 | memory_limit = 128M 410 | 411 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 412 | ; Error handling and logging ; 413 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 414 | 415 | ; This directive informs PHP of which errors, warnings and notices you would like 416 | ; it to take action for. The recommended way of setting values for this 417 | ; directive is through the use of the error level constants and bitwise 418 | ; operators. The error level constants are below here for convenience as well as 419 | ; some common settings and their meanings. 420 | ; By default, PHP is set to take action on all errors, notices and warnings EXCEPT 421 | ; those related to E_NOTICE and E_STRICT, which together cover best practices and 422 | ; recommended coding standards in PHP. For performance reasons, this is the 423 | ; recommend error reporting setting. Your production server shouldn't be wasting 424 | ; resources complaining about best practices and coding standards. That's what 425 | ; development servers and development settings are for. 426 | ; Note: The php.ini-development file has this setting as E_ALL. This 427 | ; means it pretty much reports everything which is exactly what you want during 428 | ; development and early testing. 429 | ; 430 | ; Error Level Constants: 431 | ; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0) 432 | ; E_ERROR - fatal run-time errors 433 | ; E_RECOVERABLE_ERROR - almost fatal run-time errors 434 | ; E_WARNING - run-time warnings (non-fatal errors) 435 | ; E_PARSE - compile-time parse errors 436 | ; E_NOTICE - run-time notices (these are warnings which often result 437 | ; from a bug in your code, but it's possible that it was 438 | ; intentional (e.g., using an uninitialized variable and 439 | ; relying on the fact it is automatically initialized to an 440 | ; empty string) 441 | ; E_STRICT - run-time notices, enable to have PHP suggest changes 442 | ; to your code which will ensure the best interoperability 443 | ; and forward compatibility of your code 444 | ; E_CORE_ERROR - fatal errors that occur during PHP's initial startup 445 | ; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's 446 | ; initial startup 447 | ; E_COMPILE_ERROR - fatal compile-time errors 448 | ; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) 449 | ; E_USER_ERROR - user-generated error message 450 | ; E_USER_WARNING - user-generated warning message 451 | ; E_USER_NOTICE - user-generated notice message 452 | ; E_DEPRECATED - warn about code that will not work in future versions 453 | ; of PHP 454 | ; E_USER_DEPRECATED - user-generated deprecation warnings 455 | ; 456 | ; Common Values: 457 | ; E_ALL (Show all errors, warnings and notices including coding standards.) 458 | ; E_ALL & ~E_NOTICE (Show all errors, except for notices) 459 | ; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) 460 | ; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) 461 | ; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 462 | ; Development Value: E_ALL 463 | ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT 464 | ; http://php.net/error-reporting 465 | error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT 466 | 467 | ; This directive controls whether or not and where PHP will output errors, 468 | ; notices and warnings too. Error output is very useful during development, but 469 | ; it could be very dangerous in production environments. Depending on the code 470 | ; which is triggering the error, sensitive information could potentially leak 471 | ; out of your application such as database usernames and passwords or worse. 472 | ; For production environments, we recommend logging errors rather than 473 | ; sending them to STDOUT. 474 | ; Possible Values: 475 | ; Off = Do not display any errors 476 | ; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) 477 | ; On or stdout = Display errors to STDOUT 478 | ; Default Value: On 479 | ; Development Value: On 480 | ; Production Value: Off 481 | ; http://php.net/display-errors 482 | display_errors = Off 483 | 484 | ; The display of errors which occur during PHP's startup sequence are handled 485 | ; separately from display_errors. PHP's default behavior is to suppress those 486 | ; errors from clients. Turning the display of startup errors on can be useful in 487 | ; debugging configuration problems. We strongly recommend you 488 | ; set this to 'off' for production servers. 489 | ; Default Value: Off 490 | ; Development Value: On 491 | ; Production Value: Off 492 | ; http://php.net/display-startup-errors 493 | display_startup_errors = Off 494 | 495 | ; Besides displaying errors, PHP can also log errors to locations such as a 496 | ; server-specific log, STDERR, or a location specified by the error_log 497 | ; directive found below. While errors should not be displayed on productions 498 | ; servers they should still be monitored and logging is a great way to do that. 499 | ; Default Value: Off 500 | ; Development Value: On 501 | ; Production Value: On 502 | ; http://php.net/log-errors 503 | log_errors = On 504 | 505 | ; Set maximum length of log_errors. In error_log information about the source is 506 | ; added. The default is 1024 and 0 allows to not apply any maximum length at all. 507 | ; http://php.net/log-errors-max-len 508 | log_errors_max_len = 1024 509 | 510 | ; Do not log repeated messages. Repeated errors must occur in same file on same 511 | ; line unless ignore_repeated_source is set true. 512 | ; http://php.net/ignore-repeated-errors 513 | ignore_repeated_errors = Off 514 | 515 | ; Ignore source of message when ignoring repeated messages. When this setting 516 | ; is On you will not log errors with repeated messages from different files or 517 | ; source lines. 518 | ; http://php.net/ignore-repeated-source 519 | ignore_repeated_source = Off 520 | 521 | ; If this parameter is set to Off, then memory leaks will not be shown (on 522 | ; stdout or in the log). This is only effective in a debug compile, and if 523 | ; error reporting includes E_WARNING in the allowed list 524 | ; http://php.net/report-memleaks 525 | report_memleaks = On 526 | 527 | ; This setting is on by default. 528 | ;report_zend_debug = 0 529 | 530 | ; Store the last error/warning message in $php_errormsg (boolean). Setting this value 531 | ; to On can assist in debugging and is appropriate for development servers. It should 532 | ; however be disabled on production servers. 533 | ; This directive is DEPRECATED. 534 | ; Default Value: Off 535 | ; Development Value: Off 536 | ; Production Value: Off 537 | ; http://php.net/track-errors 538 | ;track_errors = Off 539 | 540 | ; Turn off normal error reporting and emit XML-RPC error XML 541 | ; http://php.net/xmlrpc-errors 542 | ;xmlrpc_errors = 0 543 | 544 | ; An XML-RPC faultCode 545 | ;xmlrpc_error_number = 0 546 | 547 | ; When PHP displays or logs an error, it has the capability of formatting the 548 | ; error message as HTML for easier reading. This directive controls whether 549 | ; the error message is formatted as HTML or not. 550 | ; Note: This directive is hardcoded to Off for the CLI SAPI 551 | ; http://php.net/html-errors 552 | ;html_errors = On 553 | 554 | ; If html_errors is set to On *and* docref_root is not empty, then PHP 555 | ; produces clickable error messages that direct to a page describing the error 556 | ; or function causing the error in detail. 557 | ; You can download a copy of the PHP manual from http://php.net/docs 558 | ; and change docref_root to the base URL of your local copy including the 559 | ; leading '/'. You must also specify the file extension being used including 560 | ; the dot. PHP's default behavior is to leave these settings empty, in which 561 | ; case no links to documentation are generated. 562 | ; Note: Never use this feature for production boxes. 563 | ; http://php.net/docref-root 564 | ; Examples 565 | ;docref_root = "/phpmanual/" 566 | 567 | ; http://php.net/docref-ext 568 | ;docref_ext = .html 569 | 570 | ; String to output before an error message. PHP's default behavior is to leave 571 | ; this setting blank. 572 | ; http://php.net/error-prepend-string 573 | ; Example: 574 | ;error_prepend_string = "" 575 | 576 | ; String to output after an error message. PHP's default behavior is to leave 577 | ; this setting blank. 578 | ; http://php.net/error-append-string 579 | ; Example: 580 | ;error_append_string = "" 581 | 582 | ; Log errors to specified file. PHP's default behavior is to leave this value 583 | ; empty. 584 | ; http://php.net/error-log 585 | ; Example: 586 | ;error_log = php_errors.log 587 | ; Log errors to syslog (Event Log on Windows). 588 | ;error_log = syslog 589 | 590 | ; The syslog ident is a string which is prepended to every message logged 591 | ; to syslog. Only used when error_log is set to syslog. 592 | ;syslog.ident = php 593 | 594 | ; The syslog facility is used to specify what type of program is logging 595 | ; the message. Only used when error_log is set to syslog. 596 | ;syslog.facility = user 597 | 598 | ; Set this to disable filtering control characters (the default). 599 | ; Some loggers only accept NVT-ASCII, others accept anything that's not 600 | ; control characters. If your logger accepts everything, then no filtering 601 | ; is needed at all. 602 | ; Allowed values are: 603 | ; ascii (all printable ASCII characters and NL) 604 | ; no-ctrl (all characters except control characters) 605 | ; all (all characters) 606 | ; raw (like "all", but messages are not split at newlines) 607 | ; http://php.net/syslog.filter 608 | ;syslog.filter = ascii 609 | 610 | ;windows.show_crt_warning 611 | ; Default value: 0 612 | ; Development value: 0 613 | ; Production value: 0 614 | 615 | ;;;;;;;;;;;;;;;;; 616 | ; Data Handling ; 617 | ;;;;;;;;;;;;;;;;; 618 | 619 | ; The separator used in PHP generated URLs to separate arguments. 620 | ; PHP's default setting is "&". 621 | ; http://php.net/arg-separator.output 622 | ; Example: 623 | ;arg_separator.output = "&" 624 | 625 | ; List of separator(s) used by PHP to parse input URLs into variables. 626 | ; PHP's default setting is "&". 627 | ; NOTE: Every character in this directive is considered as separator! 628 | ; http://php.net/arg-separator.input 629 | ; Example: 630 | ;arg_separator.input = ";&" 631 | 632 | ; This directive determines which super global arrays are registered when PHP 633 | ; starts up. G,P,C,E & S are abbreviations for the following respective super 634 | ; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty 635 | ; paid for the registration of these arrays and because ENV is not as commonly 636 | ; used as the others, ENV is not recommended on productions servers. You 637 | ; can still get access to the environment variables through getenv() should you 638 | ; need to. 639 | ; Default Value: "EGPCS" 640 | ; Development Value: "GPCS" 641 | ; Production Value: "GPCS"; 642 | ; http://php.net/variables-order 643 | variables_order = "GPCS" 644 | 645 | ; This directive determines which super global data (G,P & C) should be 646 | ; registered into the super global array REQUEST. If so, it also determines 647 | ; the order in which that data is registered. The values for this directive 648 | ; are specified in the same manner as the variables_order directive, 649 | ; EXCEPT one. Leaving this value empty will cause PHP to use the value set 650 | ; in the variables_order directive. It does not mean it will leave the super 651 | ; globals array REQUEST empty. 652 | ; Default Value: None 653 | ; Development Value: "GP" 654 | ; Production Value: "GP" 655 | ; http://php.net/request-order 656 | request_order = "GP" 657 | 658 | ; This directive determines whether PHP registers $argv & $argc each time it 659 | ; runs. $argv contains an array of all the arguments passed to PHP when a script 660 | ; is invoked. $argc contains an integer representing the number of arguments 661 | ; that were passed when the script was invoked. These arrays are extremely 662 | ; useful when running scripts from the command line. When this directive is 663 | ; enabled, registering these variables consumes CPU cycles and memory each time 664 | ; a script is executed. For performance reasons, this feature should be disabled 665 | ; on production servers. 666 | ; Note: This directive is hardcoded to On for the CLI SAPI 667 | ; Default Value: On 668 | ; Development Value: Off 669 | ; Production Value: Off 670 | ; http://php.net/register-argc-argv 671 | register_argc_argv = Off 672 | 673 | ; When enabled, the ENV, REQUEST and SERVER variables are created when they're 674 | ; first used (Just In Time) instead of when the script starts. If these 675 | ; variables are not used within a script, having this directive on will result 676 | ; in a performance gain. The PHP directive register_argc_argv must be disabled 677 | ; for this directive to have any effect. 678 | ; http://php.net/auto-globals-jit 679 | auto_globals_jit = On 680 | 681 | ; Whether PHP will read the POST data. 682 | ; This option is enabled by default. 683 | ; Most likely, you won't want to disable this option globally. It causes $_POST 684 | ; and $_FILES to always be empty; the only way you will be able to read the 685 | ; POST data will be through the php://input stream wrapper. This can be useful 686 | ; to proxy requests or to process the POST data in a memory efficient fashion. 687 | ; http://php.net/enable-post-data-reading 688 | ;enable_post_data_reading = Off 689 | 690 | ; Maximum size of POST data that PHP will accept. 691 | ; Its value may be 0 to disable the limit. It is ignored if POST data reading 692 | ; is disabled through enable_post_data_reading. 693 | ; http://php.net/post-max-size 694 | post_max_size = 8M 695 | 696 | ; Automatically add files before PHP document. 697 | ; http://php.net/auto-prepend-file 698 | auto_prepend_file = 699 | 700 | ; Automatically add files after PHP document. 701 | ; http://php.net/auto-append-file 702 | auto_append_file = 703 | 704 | ; By default, PHP will output a media type using the Content-Type header. To 705 | ; disable this, simply set it to be empty. 706 | ; 707 | ; PHP's built-in default media type is set to text/html. 708 | ; http://php.net/default-mimetype 709 | default_mimetype = "text/html" 710 | 711 | ; PHP's default character set is set to UTF-8. 712 | ; http://php.net/default-charset 713 | default_charset = "UTF-8" 714 | 715 | ; PHP internal character encoding is set to empty. 716 | ; If empty, default_charset is used. 717 | ; http://php.net/internal-encoding 718 | ;internal_encoding = 719 | 720 | ; PHP input character encoding is set to empty. 721 | ; If empty, default_charset is used. 722 | ; http://php.net/input-encoding 723 | ;input_encoding = 724 | 725 | ; PHP output character encoding is set to empty. 726 | ; If empty, default_charset is used. 727 | ; See also output_buffer. 728 | ; http://php.net/output-encoding 729 | ;output_encoding = 730 | 731 | ;;;;;;;;;;;;;;;;;;;;;;;;; 732 | ; Paths and Directories ; 733 | ;;;;;;;;;;;;;;;;;;;;;;;;; 734 | 735 | ; UNIX: "/path1:/path2" 736 | ;include_path = ".:/php/includes" 737 | ; 738 | ; Windows: "\path1;\path2" 739 | ;include_path = ".;c:\php\includes" 740 | ; 741 | ; PHP's default setting for include_path is ".;/path/to/php/pear" 742 | ; http://php.net/include-path 743 | 744 | ; The root of the PHP pages, used only if nonempty. 745 | ; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root 746 | ; if you are running php as a CGI under any web server (other than IIS) 747 | ; see documentation for security issues. The alternate is to use the 748 | ; cgi.force_redirect configuration below 749 | ; http://php.net/doc-root 750 | doc_root = 751 | 752 | ; The directory under which PHP opens the script using /~username used only 753 | ; if nonempty. 754 | ; http://php.net/user-dir 755 | user_dir = 756 | 757 | ; Directory in which the loadable extensions (modules) reside. 758 | ; http://php.net/extension-dir 759 | ;extension_dir = "./" 760 | ; On windows: 761 | ;extension_dir = "ext" 762 | 763 | ; Directory where the temporary files should be placed. 764 | ; Defaults to the system default (see sys_get_temp_dir) 765 | ;sys_temp_dir = "/tmp" 766 | 767 | ; Whether or not to enable the dl() function. The dl() function does NOT work 768 | ; properly in multithreaded servers, such as IIS or Zeus, and is automatically 769 | ; disabled on them. 770 | ; http://php.net/enable-dl 771 | enable_dl = Off 772 | 773 | ; cgi.force_redirect is necessary to provide security running PHP as a CGI under 774 | ; most web servers. Left undefined, PHP turns this on by default. You can 775 | ; turn it off here AT YOUR OWN RISK 776 | ; **You CAN safely turn this off for IIS, in fact, you MUST.** 777 | ; http://php.net/cgi.force-redirect 778 | ;cgi.force_redirect = 1 779 | 780 | ; if cgi.nph is enabled it will force cgi to always sent Status: 200 with 781 | ; every request. PHP's default behavior is to disable this feature. 782 | ;cgi.nph = 1 783 | 784 | ; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape 785 | ; (iPlanet) web servers, you MAY need to set an environment variable name that PHP 786 | ; will look for to know it is OK to continue execution. Setting this variable MAY 787 | ; cause security issues, KNOW WHAT YOU ARE DOING FIRST. 788 | ; http://php.net/cgi.redirect-status-env 789 | ;cgi.redirect_status_env = 790 | 791 | ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's 792 | ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok 793 | ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting 794 | ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting 795 | ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts 796 | ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. 797 | ; http://php.net/cgi.fix-pathinfo 798 | ;cgi.fix_pathinfo=1 799 | 800 | ; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside 801 | ; of the web tree and people will not be able to circumvent .htaccess security. 802 | ;cgi.discard_path=1 803 | 804 | ; FastCGI under IIS supports the ability to impersonate 805 | ; security tokens of the calling client. This allows IIS to define the 806 | ; security context that the request runs under. mod_fastcgi under Apache 807 | ; does not currently support this feature (03/17/2002) 808 | ; Set to 1 if running under IIS. Default is zero. 809 | ; http://php.net/fastcgi.impersonate 810 | ;fastcgi.impersonate = 1 811 | 812 | ; Disable logging through FastCGI connection. PHP's default behavior is to enable 813 | ; this feature. 814 | ;fastcgi.logging = 0 815 | 816 | ; cgi.rfc2616_headers configuration option tells PHP what type of headers to 817 | ; use when sending HTTP response code. If set to 0, PHP sends Status: header that 818 | ; is supported by Apache. When this option is set to 1, PHP will send 819 | ; RFC2616 compliant header. 820 | ; Default is zero. 821 | ; http://php.net/cgi.rfc2616-headers 822 | ;cgi.rfc2616_headers = 0 823 | 824 | ; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! 825 | ; (shebang) at the top of the running script. This line might be needed if the 826 | ; script support running both as stand-alone script and via PHP CGI<. PHP in CGI 827 | ; mode skips this line and ignores its content if this directive is turned on. 828 | ; http://php.net/cgi.check-shebang-line 829 | ;cgi.check_shebang_line=1 830 | 831 | ;;;;;;;;;;;;;;;; 832 | ; File Uploads ; 833 | ;;;;;;;;;;;;;;;; 834 | 835 | ; Whether to allow HTTP file uploads. 836 | ; http://php.net/file-uploads 837 | file_uploads = On 838 | 839 | ; Temporary directory for HTTP uploaded files (will use system default if not 840 | ; specified). 841 | ; http://php.net/upload-tmp-dir 842 | ;upload_tmp_dir = 843 | 844 | ; Maximum allowed size for uploaded files. 845 | ; http://php.net/upload-max-filesize 846 | upload_max_filesize = 2M 847 | 848 | ; Maximum number of files that can be uploaded via a single request 849 | max_file_uploads = 20 850 | 851 | ;;;;;;;;;;;;;;;;;; 852 | ; Fopen wrappers ; 853 | ;;;;;;;;;;;;;;;;;; 854 | 855 | ; Whether to allow the treatment of URLs (like http:// or ftp://) as files. 856 | ; http://php.net/allow-url-fopen 857 | allow_url_fopen = On 858 | 859 | ; Whether to allow include/require to open URLs (like http:// or ftp://) as files. 860 | ; http://php.net/allow-url-include 861 | allow_url_include = Off 862 | 863 | ; Define the anonymous ftp password (your email address). PHP's default setting 864 | ; for this is empty. 865 | ; http://php.net/from 866 | ;from="john@doe.com" 867 | 868 | ; Define the User-Agent string. PHP's default setting for this is empty. 869 | ; http://php.net/user-agent 870 | ;user_agent="PHP" 871 | 872 | ; Default timeout for socket based streams (seconds) 873 | ; http://php.net/default-socket-timeout 874 | default_socket_timeout = 60 875 | 876 | ; If your scripts have to deal with files from Macintosh systems, 877 | ; or you are running on a Mac and need to deal with files from 878 | ; unix or win32 systems, setting this flag will cause PHP to 879 | ; automatically detect the EOL character in those files so that 880 | ; fgets() and file() will work regardless of the source of the file. 881 | ; http://php.net/auto-detect-line-endings 882 | ;auto_detect_line_endings = Off 883 | 884 | ;;;;;;;;;;;;;;;;;;;;;; 885 | ; Dynamic Extensions ; 886 | ;;;;;;;;;;;;;;;;;;;;;; 887 | 888 | ; If you wish to have an extension loaded automatically, use the following 889 | ; syntax: 890 | ; 891 | ; extension=modulename 892 | ; 893 | ; For example: 894 | ; 895 | ; extension=mysqli 896 | ; 897 | ; When the extension library to load is not located in the default extension 898 | ; directory, You may specify an absolute path to the library file: 899 | ; 900 | ; extension=/path/to/extension/mysqli.so 901 | ; 902 | ; Note : The syntax used in previous PHP versions ('extension=.so' and 903 | ; 'extension='php_.dll') is supported for legacy reasons and may be 904 | ; deprecated in a future PHP major version. So, when it is possible, please 905 | ; move to the new ('extension=) syntax. 906 | ; 907 | ; Notes for Windows environments : 908 | ; 909 | ; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+) 910 | ; extension folders as well as the separate PECL DLL download (PHP 5+). 911 | ; Be sure to appropriately set the extension_dir directive. 912 | ; 913 | ;extension=bz2 914 | ;extension=curl 915 | ;extension=ffi 916 | ;extension=fileinfo 917 | ;extension=gd2 918 | ;extension=gettext 919 | ;extension=gmp 920 | ;extension=intl 921 | ;extension=imap 922 | ;extension=ldap 923 | ;extension=mbstring 924 | ;extension=exif ; Must be after mbstring as it depends on it 925 | ;extension=mysqli 926 | ;extension=oci8_12c ; Use with Oracle Database 12c Instant Client 927 | ;extension=odbc 928 | ;extension=openssl 929 | ;extension=pdo_firebird 930 | ;extension=pdo_mysql 931 | ;extension=pdo_oci 932 | ;extension=pdo_odbc 933 | ;extension=pdo_pgsql 934 | ;extension=pdo_sqlite 935 | ;extension=pgsql 936 | ;extension=shmop 937 | 938 | ; The MIBS data available in the PHP distribution must be installed. 939 | ; See http://www.php.net/manual/en/snmp.installation.php 940 | ;extension=snmp 941 | 942 | ;extension=soap 943 | ;extension=sockets 944 | ;extension=sodium 945 | ;extension=sqlite3 946 | ;extension=tidy 947 | ;extension=xmlrpc 948 | ;extension=xsl 949 | 950 | ;;;;;;;;;;;;;;;;;;; 951 | ; Module Settings ; 952 | ;;;;;;;;;;;;;;;;;;; 953 | 954 | [CLI Server] 955 | ; Whether the CLI web server uses ANSI color coding in its terminal output. 956 | cli_server.color = On 957 | 958 | [Date] 959 | ; Defines the default timezone used by the date functions 960 | ; http://php.net/date.timezone 961 | ;date.timezone = 962 | 963 | ; http://php.net/date.default-latitude 964 | ;date.default_latitude = 31.7667 965 | 966 | ; http://php.net/date.default-longitude 967 | ;date.default_longitude = 35.2333 968 | 969 | ; http://php.net/date.sunrise-zenith 970 | ;date.sunrise_zenith = 90.583333 971 | 972 | ; http://php.net/date.sunset-zenith 973 | ;date.sunset_zenith = 90.583333 974 | 975 | [filter] 976 | ; http://php.net/filter.default 977 | ;filter.default = unsafe_raw 978 | 979 | ; http://php.net/filter.default-flags 980 | ;filter.default_flags = 981 | 982 | [iconv] 983 | ; Use of this INI entry is deprecated, use global input_encoding instead. 984 | ; If empty, default_charset or input_encoding or iconv.input_encoding is used. 985 | ; The precedence is: default_charset < input_encoding < iconv.input_encoding 986 | ;iconv.input_encoding = 987 | 988 | ; Use of this INI entry is deprecated, use global internal_encoding instead. 989 | ; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. 990 | ; The precedence is: default_charset < internal_encoding < iconv.internal_encoding 991 | ;iconv.internal_encoding = 992 | 993 | ; Use of this INI entry is deprecated, use global output_encoding instead. 994 | ; If empty, default_charset or output_encoding or iconv.output_encoding is used. 995 | ; The precedence is: default_charset < output_encoding < iconv.output_encoding 996 | ; To use an output encoding conversion, iconv's output handler must be set 997 | ; otherwise output encoding conversion cannot be performed. 998 | ;iconv.output_encoding = 999 | 1000 | [imap] 1001 | ; rsh/ssh logins are disabled by default. Use this INI entry if you want to 1002 | ; enable them. Note that the IMAP library does not filter mailbox names before 1003 | ; passing them to rsh/ssh command, thus passing untrusted data to this function 1004 | ; with rsh/ssh enabled is insecure. 1005 | ;imap.enable_insecure_rsh=0 1006 | 1007 | [intl] 1008 | ;intl.default_locale = 1009 | ; This directive allows you to produce PHP errors when some error 1010 | ; happens within intl functions. The value is the level of the error produced. 1011 | ; Default is 0, which does not produce any errors. 1012 | ;intl.error_level = E_WARNING 1013 | ;intl.use_exceptions = 0 1014 | 1015 | [sqlite3] 1016 | ; Directory pointing to SQLite3 extensions 1017 | ; http://php.net/sqlite3.extension-dir 1018 | ;sqlite3.extension_dir = 1019 | 1020 | ; SQLite defensive mode flag (only available from SQLite 3.26+) 1021 | ; When the defensive flag is enabled, language features that allow ordinary 1022 | ; SQL to deliberately corrupt the database file are disabled. This forbids 1023 | ; writing directly to the schema, shadow tables (eg. FTS data tables), or 1024 | ; the sqlite_dbpage virtual table. 1025 | ; https://www.sqlite.org/c3ref/c_dbconfig_defensive.html 1026 | ; (for older SQLite versions, this flag has no use) 1027 | ;sqlite3.defensive = 1 1028 | 1029 | [Pcre] 1030 | ; PCRE library backtracking limit. 1031 | ; http://php.net/pcre.backtrack-limit 1032 | ;pcre.backtrack_limit=100000 1033 | 1034 | ; PCRE library recursion limit. 1035 | ; Please note that if you set this value to a high number you may consume all 1036 | ; the available process stack and eventually crash PHP (due to reaching the 1037 | ; stack size limit imposed by the Operating System). 1038 | ; http://php.net/pcre.recursion-limit 1039 | ;pcre.recursion_limit=100000 1040 | 1041 | ; Enables or disables JIT compilation of patterns. This requires the PCRE 1042 | ; library to be compiled with JIT support. 1043 | ;pcre.jit=1 1044 | 1045 | [Pdo] 1046 | ; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" 1047 | ; http://php.net/pdo-odbc.connection-pooling 1048 | ;pdo_odbc.connection_pooling=strict 1049 | 1050 | ;pdo_odbc.db2_instance_name 1051 | 1052 | [Pdo_mysql] 1053 | ; Default socket name for local MySQL connects. If empty, uses the built-in 1054 | ; MySQL defaults. 1055 | pdo_mysql.default_socket= 1056 | 1057 | [Phar] 1058 | ; http://php.net/phar.readonly 1059 | ;phar.readonly = On 1060 | 1061 | ; http://php.net/phar.require-hash 1062 | ;phar.require_hash = On 1063 | 1064 | ;phar.cache_list = 1065 | 1066 | [mail function] 1067 | ; For Win32 only. 1068 | ; http://php.net/smtp 1069 | SMTP = localhost 1070 | ; http://php.net/smtp-port 1071 | smtp_port = 25 1072 | 1073 | ; For Win32 only. 1074 | ; http://php.net/sendmail-from 1075 | ;sendmail_from = me@example.com 1076 | 1077 | ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). 1078 | ; http://php.net/sendmail-path 1079 | ;sendmail_path = 1080 | 1081 | ; Force the addition of the specified parameters to be passed as extra parameters 1082 | ; to the sendmail binary. These parameters will always replace the value of 1083 | ; the 5th parameter to mail(). 1084 | ;mail.force_extra_parameters = 1085 | 1086 | ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename 1087 | mail.add_x_header = Off 1088 | 1089 | ; The path to a log file that will log all mail() calls. Log entries include 1090 | ; the full path of the script, line number, To address and headers. 1091 | ;mail.log = 1092 | ; Log mail to syslog (Event Log on Windows). 1093 | ;mail.log = syslog 1094 | 1095 | [ODBC] 1096 | ; http://php.net/odbc.default-db 1097 | ;odbc.default_db = Not yet implemented 1098 | 1099 | ; http://php.net/odbc.default-user 1100 | ;odbc.default_user = Not yet implemented 1101 | 1102 | ; http://php.net/odbc.default-pw 1103 | ;odbc.default_pw = Not yet implemented 1104 | 1105 | ; Controls the ODBC cursor model. 1106 | ; Default: SQL_CURSOR_STATIC (default). 1107 | ;odbc.default_cursortype 1108 | 1109 | ; Allow or prevent persistent links. 1110 | ; http://php.net/odbc.allow-persistent 1111 | odbc.allow_persistent = On 1112 | 1113 | ; Check that a connection is still valid before reuse. 1114 | ; http://php.net/odbc.check-persistent 1115 | odbc.check_persistent = On 1116 | 1117 | ; Maximum number of persistent links. -1 means no limit. 1118 | ; http://php.net/odbc.max-persistent 1119 | odbc.max_persistent = -1 1120 | 1121 | ; Maximum number of links (persistent + non-persistent). -1 means no limit. 1122 | ; http://php.net/odbc.max-links 1123 | odbc.max_links = -1 1124 | 1125 | ; Handling of LONG fields. Returns number of bytes to variables. 0 means 1126 | ; passthru. 1127 | ; http://php.net/odbc.defaultlrl 1128 | odbc.defaultlrl = 4096 1129 | 1130 | ; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. 1131 | ; See the documentation on odbc_binmode and odbc_longreadlen for an explanation 1132 | ; of odbc.defaultlrl and odbc.defaultbinmode 1133 | ; http://php.net/odbc.defaultbinmode 1134 | odbc.defaultbinmode = 1 1135 | 1136 | [MySQLi] 1137 | 1138 | ; Maximum number of persistent links. -1 means no limit. 1139 | ; http://php.net/mysqli.max-persistent 1140 | mysqli.max_persistent = -1 1141 | 1142 | ; Allow accessing, from PHP's perspective, local files with LOAD DATA statements 1143 | ; http://php.net/mysqli.allow_local_infile 1144 | ;mysqli.allow_local_infile = On 1145 | 1146 | ; Allow or prevent persistent links. 1147 | ; http://php.net/mysqli.allow-persistent 1148 | mysqli.allow_persistent = On 1149 | 1150 | ; Maximum number of links. -1 means no limit. 1151 | ; http://php.net/mysqli.max-links 1152 | mysqli.max_links = -1 1153 | 1154 | ; Default port number for mysqli_connect(). If unset, mysqli_connect() will use 1155 | ; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the 1156 | ; compile-time value defined MYSQL_PORT (in that order). Win32 will only look 1157 | ; at MYSQL_PORT. 1158 | ; http://php.net/mysqli.default-port 1159 | mysqli.default_port = 3306 1160 | 1161 | ; Default socket name for local MySQL connects. If empty, uses the built-in 1162 | ; MySQL defaults. 1163 | ; http://php.net/mysqli.default-socket 1164 | mysqli.default_socket = 1165 | 1166 | ; Default host for mysqli_connect() (doesn't apply in safe mode). 1167 | ; http://php.net/mysqli.default-host 1168 | mysqli.default_host = 1169 | 1170 | ; Default user for mysqli_connect() (doesn't apply in safe mode). 1171 | ; http://php.net/mysqli.default-user 1172 | mysqli.default_user = 1173 | 1174 | ; Default password for mysqli_connect() (doesn't apply in safe mode). 1175 | ; Note that this is generally a *bad* idea to store passwords in this file. 1176 | ; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") 1177 | ; and reveal this password! And of course, any users with read access to this 1178 | ; file will be able to reveal the password as well. 1179 | ; http://php.net/mysqli.default-pw 1180 | mysqli.default_pw = 1181 | 1182 | ; Allow or prevent reconnect 1183 | mysqli.reconnect = Off 1184 | 1185 | [mysqlnd] 1186 | ; Enable / Disable collection of general statistics by mysqlnd which can be 1187 | ; used to tune and monitor MySQL operations. 1188 | mysqlnd.collect_statistics = On 1189 | 1190 | ; Enable / Disable collection of memory usage statistics by mysqlnd which can be 1191 | ; used to tune and monitor MySQL operations. 1192 | mysqlnd.collect_memory_statistics = Off 1193 | 1194 | ; Records communication from all extensions using mysqlnd to the specified log 1195 | ; file. 1196 | ; http://php.net/mysqlnd.debug 1197 | ;mysqlnd.debug = 1198 | 1199 | ; Defines which queries will be logged. 1200 | ;mysqlnd.log_mask = 0 1201 | 1202 | ; Default size of the mysqlnd memory pool, which is used by result sets. 1203 | ;mysqlnd.mempool_default_size = 16000 1204 | 1205 | ; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. 1206 | ;mysqlnd.net_cmd_buffer_size = 2048 1207 | 1208 | ; Size of a pre-allocated buffer used for reading data sent by the server in 1209 | ; bytes. 1210 | ;mysqlnd.net_read_buffer_size = 32768 1211 | 1212 | ; Timeout for network requests in seconds. 1213 | ;mysqlnd.net_read_timeout = 31536000 1214 | 1215 | ; SHA-256 Authentication Plugin related. File with the MySQL server public RSA 1216 | ; key. 1217 | ;mysqlnd.sha256_server_public_key = 1218 | 1219 | [OCI8] 1220 | 1221 | ; Connection: Enables privileged connections using external 1222 | ; credentials (OCI_SYSOPER, OCI_SYSDBA) 1223 | ; http://php.net/oci8.privileged-connect 1224 | ;oci8.privileged_connect = Off 1225 | 1226 | ; Connection: The maximum number of persistent OCI8 connections per 1227 | ; process. Using -1 means no limit. 1228 | ; http://php.net/oci8.max-persistent 1229 | ;oci8.max_persistent = -1 1230 | 1231 | ; Connection: The maximum number of seconds a process is allowed to 1232 | ; maintain an idle persistent connection. Using -1 means idle 1233 | ; persistent connections will be maintained forever. 1234 | ; http://php.net/oci8.persistent-timeout 1235 | ;oci8.persistent_timeout = -1 1236 | 1237 | ; Connection: The number of seconds that must pass before issuing a 1238 | ; ping during oci_pconnect() to check the connection validity. When 1239 | ; set to 0, each oci_pconnect() will cause a ping. Using -1 disables 1240 | ; pings completely. 1241 | ; http://php.net/oci8.ping-interval 1242 | ;oci8.ping_interval = 60 1243 | 1244 | ; Connection: Set this to a user chosen connection class to be used 1245 | ; for all pooled server requests with Oracle 11g Database Resident 1246 | ; Connection Pooling (DRCP). To use DRCP, this value should be set to 1247 | ; the same string for all web servers running the same application, 1248 | ; the database pool must be configured, and the connection string must 1249 | ; specify to use a pooled server. 1250 | ;oci8.connection_class = 1251 | 1252 | ; High Availability: Using On lets PHP receive Fast Application 1253 | ; Notification (FAN) events generated when a database node fails. The 1254 | ; database must also be configured to post FAN events. 1255 | ;oci8.events = Off 1256 | 1257 | ; Tuning: This option enables statement caching, and specifies how 1258 | ; many statements to cache. Using 0 disables statement caching. 1259 | ; http://php.net/oci8.statement-cache-size 1260 | ;oci8.statement_cache_size = 20 1261 | 1262 | ; Tuning: Enables statement prefetching and sets the default number of 1263 | ; rows that will be fetched automatically after statement execution. 1264 | ; http://php.net/oci8.default-prefetch 1265 | ;oci8.default_prefetch = 100 1266 | 1267 | ; Compatibility. Using On means oci_close() will not close 1268 | ; oci_connect() and oci_new_connect() connections. 1269 | ; http://php.net/oci8.old-oci-close-semantics 1270 | ;oci8.old_oci_close_semantics = Off 1271 | 1272 | [PostgreSQL] 1273 | ; Allow or prevent persistent links. 1274 | ; http://php.net/pgsql.allow-persistent 1275 | pgsql.allow_persistent = On 1276 | 1277 | ; Detect broken persistent links always with pg_pconnect(). 1278 | ; Auto reset feature requires a little overheads. 1279 | ; http://php.net/pgsql.auto-reset-persistent 1280 | pgsql.auto_reset_persistent = Off 1281 | 1282 | ; Maximum number of persistent links. -1 means no limit. 1283 | ; http://php.net/pgsql.max-persistent 1284 | pgsql.max_persistent = -1 1285 | 1286 | ; Maximum number of links (persistent+non persistent). -1 means no limit. 1287 | ; http://php.net/pgsql.max-links 1288 | pgsql.max_links = -1 1289 | 1290 | ; Ignore PostgreSQL backends Notice message or not. 1291 | ; Notice message logging require a little overheads. 1292 | ; http://php.net/pgsql.ignore-notice 1293 | pgsql.ignore_notice = 0 1294 | 1295 | ; Log PostgreSQL backends Notice message or not. 1296 | ; Unless pgsql.ignore_notice=0, module cannot log notice message. 1297 | ; http://php.net/pgsql.log-notice 1298 | pgsql.log_notice = 0 1299 | 1300 | [bcmath] 1301 | ; Number of decimal digits for all bcmath functions. 1302 | ; http://php.net/bcmath.scale 1303 | bcmath.scale = 0 1304 | 1305 | [browscap] 1306 | ; http://php.net/browscap 1307 | ;browscap = extra/browscap.ini 1308 | 1309 | [Session] 1310 | ; Handler used to store/retrieve data. 1311 | ; http://php.net/session.save-handler 1312 | session.save_handler = files 1313 | 1314 | ; Argument passed to save_handler. In the case of files, this is the path 1315 | ; where data files are stored. Note: Windows users have to change this 1316 | ; variable in order to use PHP's session functions. 1317 | ; 1318 | ; The path can be defined as: 1319 | ; 1320 | ; session.save_path = "N;/path" 1321 | ; 1322 | ; where N is an integer. Instead of storing all the session files in 1323 | ; /path, what this will do is use subdirectories N-levels deep, and 1324 | ; store the session data in those directories. This is useful if 1325 | ; your OS has problems with many files in one directory, and is 1326 | ; a more efficient layout for servers that handle many sessions. 1327 | ; 1328 | ; NOTE 1: PHP will not create this directory structure automatically. 1329 | ; You can use the script in the ext/session dir for that purpose. 1330 | ; NOTE 2: See the section on garbage collection below if you choose to 1331 | ; use subdirectories for session storage 1332 | ; 1333 | ; The file storage module creates files using mode 600 by default. 1334 | ; You can change that by using 1335 | ; 1336 | ; session.save_path = "N;MODE;/path" 1337 | ; 1338 | ; where MODE is the octal representation of the mode. Note that this 1339 | ; does not overwrite the process's umask. 1340 | ; http://php.net/session.save-path 1341 | ;session.save_path = "/tmp" 1342 | 1343 | ; Whether to use strict session mode. 1344 | ; Strict session mode does not accept an uninitialized session ID, and 1345 | ; regenerates the session ID if the browser sends an uninitialized session ID. 1346 | ; Strict mode protects applications from session fixation via a session adoption 1347 | ; vulnerability. It is disabled by default for maximum compatibility, but 1348 | ; enabling it is encouraged. 1349 | ; https://wiki.php.net/rfc/strict_sessions 1350 | session.use_strict_mode = 0 1351 | 1352 | ; Whether to use cookies. 1353 | ; http://php.net/session.use-cookies 1354 | session.use_cookies = 1 1355 | 1356 | ; http://php.net/session.cookie-secure 1357 | ;session.cookie_secure = 1358 | 1359 | ; This option forces PHP to fetch and use a cookie for storing and maintaining 1360 | ; the session id. We encourage this operation as it's very helpful in combating 1361 | ; session hijacking when not specifying and managing your own session id. It is 1362 | ; not the be-all and end-all of session hijacking defense, but it's a good start. 1363 | ; http://php.net/session.use-only-cookies 1364 | session.use_only_cookies = 1 1365 | 1366 | ; Name of the session (used as cookie name). 1367 | ; http://php.net/session.name 1368 | session.name = PHPSESSID 1369 | 1370 | ; Initialize session on request startup. 1371 | ; http://php.net/session.auto-start 1372 | session.auto_start = 0 1373 | 1374 | ; Lifetime in seconds of cookie or, if 0, until browser is restarted. 1375 | ; http://php.net/session.cookie-lifetime 1376 | session.cookie_lifetime = 0 1377 | 1378 | ; The path for which the cookie is valid. 1379 | ; http://php.net/session.cookie-path 1380 | session.cookie_path = / 1381 | 1382 | ; The domain for which the cookie is valid. 1383 | ; http://php.net/session.cookie-domain 1384 | session.cookie_domain = 1385 | 1386 | ; Whether or not to add the httpOnly flag to the cookie, which makes it 1387 | ; inaccessible to browser scripting languages such as JavaScript. 1388 | ; http://php.net/session.cookie-httponly 1389 | session.cookie_httponly = 1390 | 1391 | ; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF) 1392 | ; Current valid values are "Lax" or "Strict" 1393 | ; https://tools.ietf.org/html/draft-west-first-party-cookies-07 1394 | session.cookie_samesite = 1395 | 1396 | ; Handler used to serialize data. php is the standard serializer of PHP. 1397 | ; http://php.net/session.serialize-handler 1398 | session.serialize_handler = php 1399 | 1400 | ; Defines the probability that the 'garbage collection' process is started 1401 | ; on every session initialization. The probability is calculated by using 1402 | ; gc_probability/gc_divisor. Where session.gc_probability is the numerator 1403 | ; and gc_divisor is the denominator in the equation. Setting this value to 1 1404 | ; when the session.gc_divisor value is 100 will give you approximately a 1% chance 1405 | ; the gc will run on any given request. 1406 | ; Default Value: 1 1407 | ; Development Value: 1 1408 | ; Production Value: 1 1409 | ; http://php.net/session.gc-probability 1410 | session.gc_probability = 1 1411 | 1412 | ; Defines the probability that the 'garbage collection' process is started on every 1413 | ; session initialization. The probability is calculated by using the following equation: 1414 | ; gc_probability/gc_divisor. Where session.gc_probability is the numerator and 1415 | ; session.gc_divisor is the denominator in the equation. Setting this value to 100 1416 | ; when the session.gc_probability value is 1 will give you approximately a 1% chance 1417 | ; the gc will run on any given request. Increasing this value to 1000 will give you 1418 | ; a 0.1% chance the gc will run on any given request. For high volume production servers, 1419 | ; this is a more efficient approach. 1420 | ; Default Value: 100 1421 | ; Development Value: 1000 1422 | ; Production Value: 1000 1423 | ; http://php.net/session.gc-divisor 1424 | session.gc_divisor = 1000 1425 | 1426 | ; After this number of seconds, stored data will be seen as 'garbage' and 1427 | ; cleaned up by the garbage collection process. 1428 | ; http://php.net/session.gc-maxlifetime 1429 | session.gc_maxlifetime = 1440 1430 | 1431 | ; NOTE: If you are using the subdirectory option for storing session files 1432 | ; (see session.save_path above), then garbage collection does *not* 1433 | ; happen automatically. You will need to do your own garbage 1434 | ; collection through a shell script, cron entry, or some other method. 1435 | ; For example, the following script would is the equivalent of 1436 | ; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): 1437 | ; find /path/to/sessions -cmin +24 -type f | xargs rm 1438 | 1439 | ; Check HTTP Referer to invalidate externally stored URLs containing ids. 1440 | ; HTTP_REFERER has to contain this substring for the session to be 1441 | ; considered as valid. 1442 | ; http://php.net/session.referer-check 1443 | session.referer_check = 1444 | 1445 | ; Set to {nocache,private,public,} to determine HTTP caching aspects 1446 | ; or leave this empty to avoid sending anti-caching headers. 1447 | ; http://php.net/session.cache-limiter 1448 | session.cache_limiter = nocache 1449 | 1450 | ; Document expires after n minutes. 1451 | ; http://php.net/session.cache-expire 1452 | session.cache_expire = 180 1453 | 1454 | ; trans sid support is disabled by default. 1455 | ; Use of trans sid may risk your users' security. 1456 | ; Use this option with caution. 1457 | ; - User may send URL contains active session ID 1458 | ; to other person via. email/irc/etc. 1459 | ; - URL that contains active session ID may be stored 1460 | ; in publicly accessible computer. 1461 | ; - User may access your site with the same session ID 1462 | ; always using URL stored in browser's history or bookmarks. 1463 | ; http://php.net/session.use-trans-sid 1464 | session.use_trans_sid = 0 1465 | 1466 | ; Set session ID character length. This value could be between 22 to 256. 1467 | ; Shorter length than default is supported only for compatibility reason. 1468 | ; Users should use 32 or more chars. 1469 | ; http://php.net/session.sid-length 1470 | ; Default Value: 32 1471 | ; Development Value: 26 1472 | ; Production Value: 26 1473 | session.sid_length = 26 1474 | 1475 | ; The URL rewriter will look for URLs in a defined set of HTML tags. 1476 | ;
is special; if you include them here, the rewriter will 1477 | ; add a hidden field with the info which is otherwise appended 1478 | ; to URLs. tag's action attribute URL will not be modified 1479 | ; unless it is specified. 1480 | ; Note that all valid entries require a "=", even if no value follows. 1481 | ; Default Value: "a=href,area=href,frame=src,form=" 1482 | ; Development Value: "a=href,area=href,frame=src,form=" 1483 | ; Production Value: "a=href,area=href,frame=src,form=" 1484 | ; http://php.net/url-rewriter.tags 1485 | session.trans_sid_tags = "a=href,area=href,frame=src,form=" 1486 | 1487 | ; URL rewriter does not rewrite absolute URLs by default. 1488 | ; To enable rewrites for absolute paths, target hosts must be specified 1489 | ; at RUNTIME. i.e. use ini_set() 1490 | ; tags is special. PHP will check action attribute's URL regardless 1491 | ; of session.trans_sid_tags setting. 1492 | ; If no host is defined, HTTP_HOST will be used for allowed host. 1493 | ; Example value: php.net,www.php.net,wiki.php.net 1494 | ; Use "," for multiple hosts. No spaces are allowed. 1495 | ; Default Value: "" 1496 | ; Development Value: "" 1497 | ; Production Value: "" 1498 | ;session.trans_sid_hosts="" 1499 | 1500 | ; Define how many bits are stored in each character when converting 1501 | ; the binary hash data to something readable. 1502 | ; Possible values: 1503 | ; 4 (4 bits: 0-9, a-f) 1504 | ; 5 (5 bits: 0-9, a-v) 1505 | ; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") 1506 | ; Default Value: 4 1507 | ; Development Value: 5 1508 | ; Production Value: 5 1509 | ; http://php.net/session.hash-bits-per-character 1510 | session.sid_bits_per_character = 5 1511 | 1512 | ; Enable upload progress tracking in $_SESSION 1513 | ; Default Value: On 1514 | ; Development Value: On 1515 | ; Production Value: On 1516 | ; http://php.net/session.upload-progress.enabled 1517 | ;session.upload_progress.enabled = On 1518 | 1519 | ; Cleanup the progress information as soon as all POST data has been read 1520 | ; (i.e. upload completed). 1521 | ; Default Value: On 1522 | ; Development Value: On 1523 | ; Production Value: On 1524 | ; http://php.net/session.upload-progress.cleanup 1525 | ;session.upload_progress.cleanup = On 1526 | 1527 | ; A prefix used for the upload progress key in $_SESSION 1528 | ; Default Value: "upload_progress_" 1529 | ; Development Value: "upload_progress_" 1530 | ; Production Value: "upload_progress_" 1531 | ; http://php.net/session.upload-progress.prefix 1532 | ;session.upload_progress.prefix = "upload_progress_" 1533 | 1534 | ; The index name (concatenated with the prefix) in $_SESSION 1535 | ; containing the upload progress information 1536 | ; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" 1537 | ; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" 1538 | ; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" 1539 | ; http://php.net/session.upload-progress.name 1540 | ;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" 1541 | 1542 | ; How frequently the upload progress should be updated. 1543 | ; Given either in percentages (per-file), or in bytes 1544 | ; Default Value: "1%" 1545 | ; Development Value: "1%" 1546 | ; Production Value: "1%" 1547 | ; http://php.net/session.upload-progress.freq 1548 | ;session.upload_progress.freq = "1%" 1549 | 1550 | ; The minimum delay between updates, in seconds 1551 | ; Default Value: 1 1552 | ; Development Value: 1 1553 | ; Production Value: 1 1554 | ; http://php.net/session.upload-progress.min-freq 1555 | ;session.upload_progress.min_freq = "1" 1556 | 1557 | ; Only write session data when session data is changed. Enabled by default. 1558 | ; http://php.net/session.lazy-write 1559 | ;session.lazy_write = On 1560 | 1561 | [Assertion] 1562 | ; Switch whether to compile assertions at all (to have no overhead at run-time) 1563 | ; -1: Do not compile at all 1564 | ; 0: Jump over assertion at run-time 1565 | ; 1: Execute assertions 1566 | ; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) 1567 | ; Default Value: 1 1568 | ; Development Value: 1 1569 | ; Production Value: -1 1570 | ; http://php.net/zend.assertions 1571 | zend.assertions = -1 1572 | 1573 | ; Assert(expr); active by default. 1574 | ; http://php.net/assert.active 1575 | ;assert.active = On 1576 | 1577 | ; Throw an AssertionError on failed assertions 1578 | ; http://php.net/assert.exception 1579 | ;assert.exception = On 1580 | 1581 | ; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) 1582 | ; http://php.net/assert.warning 1583 | ;assert.warning = On 1584 | 1585 | ; Don't bail out by default. 1586 | ; http://php.net/assert.bail 1587 | ;assert.bail = Off 1588 | 1589 | ; User-function to be called if an assertion fails. 1590 | ; http://php.net/assert.callback 1591 | ;assert.callback = 0 1592 | 1593 | ; Eval the expression with current error_reporting(). Set to true if you want 1594 | ; error_reporting(0) around the eval(). 1595 | ; http://php.net/assert.quiet-eval 1596 | ;assert.quiet_eval = 0 1597 | 1598 | [COM] 1599 | ; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs 1600 | ; http://php.net/com.typelib-file 1601 | ;com.typelib_file = 1602 | 1603 | ; allow Distributed-COM calls 1604 | ; http://php.net/com.allow-dcom 1605 | ;com.allow_dcom = true 1606 | 1607 | ; autoregister constants of a component's typlib on com_load() 1608 | ; http://php.net/com.autoregister-typelib 1609 | ;com.autoregister_typelib = true 1610 | 1611 | ; register constants casesensitive 1612 | ; http://php.net/com.autoregister-casesensitive 1613 | ;com.autoregister_casesensitive = false 1614 | 1615 | ; show warnings on duplicate constant registrations 1616 | ; http://php.net/com.autoregister-verbose 1617 | ;com.autoregister_verbose = true 1618 | 1619 | ; The default character set code-page to use when passing strings to and from COM objects. 1620 | ; Default: system ANSI code page 1621 | ;com.code_page= 1622 | 1623 | [mbstring] 1624 | ; language for internal character representation. 1625 | ; This affects mb_send_mail() and mbstring.detect_order. 1626 | ; http://php.net/mbstring.language 1627 | ;mbstring.language = Japanese 1628 | 1629 | ; Use of this INI entry is deprecated, use global internal_encoding instead. 1630 | ; internal/script encoding. 1631 | ; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) 1632 | ; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. 1633 | ; The precedence is: default_charset < internal_encoding < iconv.internal_encoding 1634 | ;mbstring.internal_encoding = 1635 | 1636 | ; Use of this INI entry is deprecated, use global input_encoding instead. 1637 | ; http input encoding. 1638 | ; mbstring.encoding_translation = On is needed to use this setting. 1639 | ; If empty, default_charset or input_encoding or mbstring.input is used. 1640 | ; The precedence is: default_charset < input_encoding < mbsting.http_input 1641 | ; http://php.net/mbstring.http-input 1642 | ;mbstring.http_input = 1643 | 1644 | ; Use of this INI entry is deprecated, use global output_encoding instead. 1645 | ; http output encoding. 1646 | ; mb_output_handler must be registered as output buffer to function. 1647 | ; If empty, default_charset or output_encoding or mbstring.http_output is used. 1648 | ; The precedence is: default_charset < output_encoding < mbstring.http_output 1649 | ; To use an output encoding conversion, mbstring's output handler must be set 1650 | ; otherwise output encoding conversion cannot be performed. 1651 | ; http://php.net/mbstring.http-output 1652 | ;mbstring.http_output = 1653 | 1654 | ; enable automatic encoding translation according to 1655 | ; mbstring.internal_encoding setting. Input chars are 1656 | ; converted to internal encoding by setting this to On. 1657 | ; Note: Do _not_ use automatic encoding translation for 1658 | ; portable libs/applications. 1659 | ; http://php.net/mbstring.encoding-translation 1660 | ;mbstring.encoding_translation = Off 1661 | 1662 | ; automatic encoding detection order. 1663 | ; "auto" detect order is changed according to mbstring.language 1664 | ; http://php.net/mbstring.detect-order 1665 | ;mbstring.detect_order = auto 1666 | 1667 | ; substitute_character used when character cannot be converted 1668 | ; one from another 1669 | ; http://php.net/mbstring.substitute-character 1670 | ;mbstring.substitute_character = none 1671 | 1672 | ; overload(replace) single byte functions by mbstring functions. 1673 | ; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), 1674 | ; etc. Possible values are 0,1,2,4 or combination of them. 1675 | ; For example, 7 for overload everything. 1676 | ; 0: No overload 1677 | ; 1: Overload mail() function 1678 | ; 2: Overload str*() functions 1679 | ; 4: Overload ereg*() functions 1680 | ; http://php.net/mbstring.func-overload 1681 | ;mbstring.func_overload = 0 1682 | 1683 | ; enable strict encoding detection. 1684 | ; Default: Off 1685 | ;mbstring.strict_detection = On 1686 | 1687 | ; This directive specifies the regex pattern of content types for which mb_output_handler() 1688 | ; is activated. 1689 | ; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) 1690 | ;mbstring.http_output_conv_mimetype= 1691 | 1692 | ; This directive specifies maximum stack depth for mbstring regular expressions. It is similar 1693 | ; to the pcre.recursion_limit for PCRE. 1694 | ; Default: 100000 1695 | ;mbstring.regex_stack_limit=100000 1696 | 1697 | ; This directive specifies maximum retry count for mbstring regular expressions. It is similar 1698 | ; to the pcre.backtrack_limit for PCRE. 1699 | ; Default: 1000000 1700 | ;mbstring.regex_retry_limit=1000000 1701 | 1702 | [gd] 1703 | ; Tell the jpeg decode to ignore warnings and try to create 1704 | ; a gd image. The warning will then be displayed as notices 1705 | ; disabled by default 1706 | ; http://php.net/gd.jpeg-ignore-warning 1707 | ;gd.jpeg_ignore_warning = 1 1708 | 1709 | [exif] 1710 | ; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. 1711 | ; With mbstring support this will automatically be converted into the encoding 1712 | ; given by corresponding encode setting. When empty mbstring.internal_encoding 1713 | ; is used. For the decode settings you can distinguish between motorola and 1714 | ; intel byte order. A decode setting cannot be empty. 1715 | ; http://php.net/exif.encode-unicode 1716 | ;exif.encode_unicode = ISO-8859-15 1717 | 1718 | ; http://php.net/exif.decode-unicode-motorola 1719 | ;exif.decode_unicode_motorola = UCS-2BE 1720 | 1721 | ; http://php.net/exif.decode-unicode-intel 1722 | ;exif.decode_unicode_intel = UCS-2LE 1723 | 1724 | ; http://php.net/exif.encode-jis 1725 | ;exif.encode_jis = 1726 | 1727 | ; http://php.net/exif.decode-jis-motorola 1728 | ;exif.decode_jis_motorola = JIS 1729 | 1730 | ; http://php.net/exif.decode-jis-intel 1731 | ;exif.decode_jis_intel = JIS 1732 | 1733 | [Tidy] 1734 | ; The path to a default tidy configuration file to use when using tidy 1735 | ; http://php.net/tidy.default-config 1736 | ;tidy.default_config = /usr/local/lib/php/default.tcfg 1737 | 1738 | ; Should tidy clean and repair output automatically? 1739 | ; WARNING: Do not use this option if you are generating non-html content 1740 | ; such as dynamic images 1741 | ; http://php.net/tidy.clean-output 1742 | tidy.clean_output = Off 1743 | 1744 | [soap] 1745 | ; Enables or disables WSDL caching feature. 1746 | ; http://php.net/soap.wsdl-cache-enabled 1747 | soap.wsdl_cache_enabled=1 1748 | 1749 | ; Sets the directory name where SOAP extension will put cache files. 1750 | ; http://php.net/soap.wsdl-cache-dir 1751 | soap.wsdl_cache_dir="/tmp" 1752 | 1753 | ; (time to live) Sets the number of second while cached file will be used 1754 | ; instead of original one. 1755 | ; http://php.net/soap.wsdl-cache-ttl 1756 | soap.wsdl_cache_ttl=86400 1757 | 1758 | ; Sets the size of the cache limit. (Max. number of WSDL files to cache) 1759 | soap.wsdl_cache_limit = 5 1760 | 1761 | [sysvshm] 1762 | ; A default size of the shared memory segment 1763 | ;sysvshm.init_mem = 10000 1764 | 1765 | [ldap] 1766 | ; Sets the maximum number of open links or -1 for unlimited. 1767 | ldap.max_links = -1 1768 | 1769 | [dba] 1770 | ;dba.default_handler= 1771 | 1772 | [opcache] 1773 | ; Determines if Zend OPCache is enabled 1774 | ;opcache.enable=1 1775 | 1776 | ; Determines if Zend OPCache is enabled for the CLI version of PHP 1777 | ;opcache.enable_cli=0 1778 | 1779 | ; The OPcache shared memory storage size. 1780 | ;opcache.memory_consumption=128 1781 | 1782 | ; The amount of memory for interned strings in Mbytes. 1783 | ;opcache.interned_strings_buffer=8 1784 | 1785 | ; The maximum number of keys (scripts) in the OPcache hash table. 1786 | ; Only numbers between 200 and 1000000 are allowed. 1787 | ;opcache.max_accelerated_files=10000 1788 | 1789 | ; The maximum percentage of "wasted" memory until a restart is scheduled. 1790 | ;opcache.max_wasted_percentage=5 1791 | 1792 | ; When this directive is enabled, the OPcache appends the current working 1793 | ; directory to the script key, thus eliminating possible collisions between 1794 | ; files with the same name (basename). Disabling the directive improves 1795 | ; performance, but may break existing applications. 1796 | ;opcache.use_cwd=1 1797 | 1798 | ; When disabled, you must reset the OPcache manually or restart the 1799 | ; webserver for changes to the filesystem to take effect. 1800 | ;opcache.validate_timestamps=1 1801 | 1802 | ; How often (in seconds) to check file timestamps for changes to the shared 1803 | ; memory storage allocation. ("1" means validate once per second, but only 1804 | ; once per request. "0" means always validate) 1805 | ;opcache.revalidate_freq=2 1806 | 1807 | ; Enables or disables file search in include_path optimization 1808 | ;opcache.revalidate_path=0 1809 | 1810 | ; If disabled, all PHPDoc comments are dropped from the code to reduce the 1811 | ; size of the optimized code. 1812 | ;opcache.save_comments=1 1813 | 1814 | ; Allow file existence override (file_exists, etc.) performance feature. 1815 | ;opcache.enable_file_override=0 1816 | 1817 | ; A bitmask, where each bit enables or disables the appropriate OPcache 1818 | ; passes 1819 | ;opcache.optimization_level=0x7FFFBFFF 1820 | 1821 | ;opcache.dups_fix=0 1822 | 1823 | ; The location of the OPcache blacklist file (wildcards allowed). 1824 | ; Each OPcache blacklist file is a text file that holds the names of files 1825 | ; that should not be accelerated. The file format is to add each filename 1826 | ; to a new line. The filename may be a full path or just a file prefix 1827 | ; (i.e., /var/www/x blacklists all the files and directories in /var/www 1828 | ; that start with 'x'). Line starting with a ; are ignored (comments). 1829 | ;opcache.blacklist_filename= 1830 | 1831 | ; Allows exclusion of large files from being cached. By default all files 1832 | ; are cached. 1833 | ;opcache.max_file_size=0 1834 | 1835 | ; Check the cache checksum each N requests. 1836 | ; The default value of "0" means that the checks are disabled. 1837 | ;opcache.consistency_checks=0 1838 | 1839 | ; How long to wait (in seconds) for a scheduled restart to begin if the cache 1840 | ; is not being accessed. 1841 | ;opcache.force_restart_timeout=180 1842 | 1843 | ; OPcache error_log file name. Empty string assumes "stderr". 1844 | ;opcache.error_log= 1845 | 1846 | ; All OPcache errors go to the Web server log. 1847 | ; By default, only fatal errors (level 0) or errors (level 1) are logged. 1848 | ; You can also enable warnings (level 2), info messages (level 3) or 1849 | ; debug messages (level 4). 1850 | ;opcache.log_verbosity_level=1 1851 | 1852 | ; Preferred Shared Memory back-end. Leave empty and let the system decide. 1853 | ;opcache.preferred_memory_model= 1854 | 1855 | ; Protect the shared memory from unexpected writing during script execution. 1856 | ; Useful for internal debugging only. 1857 | ;opcache.protect_memory=0 1858 | 1859 | ; Allows calling OPcache API functions only from PHP scripts which path is 1860 | ; started from specified string. The default "" means no restriction 1861 | ;opcache.restrict_api= 1862 | 1863 | ; Mapping base of shared memory segments (for Windows only). All the PHP 1864 | ; processes have to map shared memory into the same address space. This 1865 | ; directive allows to manually fix the "Unable to reattach to base address" 1866 | ; errors. 1867 | ;opcache.mmap_base= 1868 | 1869 | ; Facilitates multiple OPcache instances per user (for Windows only). All PHP 1870 | ; processes with the same cache ID and user share an OPcache instance. 1871 | ;opcache.cache_id= 1872 | 1873 | ; Enables and sets the second level cache directory. 1874 | ; It should improve performance when SHM memory is full, at server restart or 1875 | ; SHM reset. The default "" disables file based caching. 1876 | ;opcache.file_cache= 1877 | 1878 | ; Enables or disables opcode caching in shared memory. 1879 | ;opcache.file_cache_only=0 1880 | 1881 | ; Enables or disables checksum validation when script loaded from file cache. 1882 | ;opcache.file_cache_consistency_checks=1 1883 | 1884 | ; Implies opcache.file_cache_only=1 for a certain process that failed to 1885 | ; reattach to the shared memory (for Windows only). Explicitly enabled file 1886 | ; cache is required. 1887 | ;opcache.file_cache_fallback=1 1888 | 1889 | ; Enables or disables copying of PHP code (text segment) into HUGE PAGES. 1890 | ; This should improve performance, but requires appropriate OS configuration. 1891 | ;opcache.huge_code_pages=1 1892 | 1893 | ; Validate cached file permissions. 1894 | ;opcache.validate_permission=0 1895 | 1896 | ; Prevent name collisions in chroot'ed environment. 1897 | ;opcache.validate_root=0 1898 | 1899 | ; If specified, it produces opcode dumps for debugging different stages of 1900 | ; optimizations. 1901 | ;opcache.opt_debug_level=0 1902 | 1903 | ; Specifies a PHP script that is going to be compiled and executed at server 1904 | ; start-up. 1905 | ; http://php.net/opcache.preload 1906 | ;opcache.preload= 1907 | 1908 | ; Preloading code as root is not allowed for security reasons. This directive 1909 | ; facilitates to let the preloading to be run as another user. 1910 | ; http://php.net/opcache.preload_user 1911 | ;opcache.preload_user= 1912 | 1913 | ; Prevents caching files that are less than this number of seconds old. It 1914 | ; protects from caching of incompletely updated files. In case all file updates 1915 | ; on your site are atomic, you may increase performance by setting it to "0". 1916 | ;opcache.file_update_protection=2 1917 | 1918 | ; Absolute path used to store shared lockfiles (for *nix only). 1919 | ;opcache.lockfile_path=/tmp 1920 | 1921 | [curl] 1922 | ; A default value for the CURLOPT_CAINFO option. This is required to be an 1923 | ; absolute path. 1924 | ;curl.cainfo = 1925 | 1926 | [openssl] 1927 | ; The location of a Certificate Authority (CA) file on the local filesystem 1928 | ; to use when verifying the identity of SSL/TLS peers. Most users should 1929 | ; not specify a value for this directive as PHP will attempt to use the 1930 | ; OS-managed cert stores in its absence. If specified, this value may still 1931 | ; be overridden on a per-stream basis via the "cafile" SSL stream context 1932 | ; option. 1933 | ;openssl.cafile= 1934 | 1935 | ; If openssl.cafile is not specified or if the CA file is not found, the 1936 | ; directory pointed to by openssl.capath is searched for a suitable 1937 | ; certificate. This value must be a correctly hashed certificate directory. 1938 | ; Most users should not specify a value for this directive as PHP will 1939 | ; attempt to use the OS-managed cert stores in its absence. If specified, 1940 | ; this value may still be overridden on a per-stream basis via the "capath" 1941 | ; SSL stream context option. 1942 | ;openssl.capath= 1943 | 1944 | [ffi] 1945 | ; FFI API restriction. Possible values: 1946 | ; "preload" - enabled in CLI scripts and preloaded files (default) 1947 | ; "false" - always disabled 1948 | ; "true" - always enabled 1949 | ;ffi.enable=preload 1950 | 1951 | ; List of headers files to preload, wildcard patterns allowed. 1952 | ;ffi.preload= 1953 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | ./tests 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Handle Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | run(); 29 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Lumen API Starter 2 | 3 | A starter template to develop API with Lumen 8. 4 | 5 | This repo will not be maintained anymore because 👇 6 | 7 | > Note: In the years since releasing Lumen, PHP has made a variety of wonderful performance improvements. For this reason, along with the availability of Laravel Octane, we no longer recommend that you begin new projects with Lumen. Instead, we recommend always beginning new projects with Laravel. 8 | 9 | https://lumen.laravel.com/docs/9.x 10 | 11 | ### Included Packages 12 | 13 | - [flipbox/lumen-generator@^8.0](https://github.com/flipboxstudio/lumen-generator) 14 | - [fruitcake/laravel-cors@^2.0](https://github.com/fruitcake/laravel-cors) 15 | - [spatie/laravel-fractal@^5.8](https://github.com/spatie/laravel-fractal) 16 | - [spatie/laravel-query-builder@^3.6](https://github.com/spatie/laravel-query-builder) 17 | - [tymon/jwt-auth@^1.0](https://github.com/tymondesigns/jwt-auth) 18 | 19 | ### Installation 20 | 21 | - Clone the Repo: 22 | - `git clone git@github.com:munza/lumen-api-starter.git` 23 | - `git clone https://github.com/munza/lumen-api-starter.git` 24 | - `cd lumen-api-starter` 25 | - SSH into the Docker container with `make ssh` and run the following. 26 | - `composer create-project` 27 | - `php artisan key:generate` 28 | - `php artisan jwt:secret` 29 | - `php artisan migrate` 30 | - Exit from Docker container with `CTRL+C` or `exit`. 31 | - Rename `docker-compose.local.yaml` to `docker-compose.overridee.yaml` 32 | - Start the local development server with `make up`. 33 | - Run tests with `make dev-test`. 34 | - Run `make` to see available commands. 35 | 36 | #### Create new user 37 | 38 | - `make ssh` 39 | - `php artisan ti` 40 | - `App\Models\User::factory()->create(['email' => 'admin@localtest.me', 'password' => 'password'])` 41 | 42 | ### Configuration 43 | 44 | - Edit `.env` file for environment variables. 45 | - Edit the files in `config` directory for application configuration. 46 | 47 | ### Usage 48 | 49 | Always `ssh` into Docker container `app` by running `make ssh` before executing any `artisan` commands. 50 | 51 | #### Add a new resource endpoint 52 | 53 | - Add endpoint in `routes/web.php`. 54 | 55 | ```php 56 | $router->group(['middleware' => 'auth:api'], function ($router) { 57 | $app->get('/users', 'UserController@index'); 58 | }); 59 | ``` 60 | 61 | - Add controller with `php artisan make:controller {name}` command 62 | 63 | - Add model at `php artisan make:model {name}`. You can use `-m` flag to add migration file and `-f` flag for factory file. 64 | 65 | - Add service at `app` directory. 66 | 67 | ```php 68 | accounts = $accounts; 97 | } 98 | 99 | // Add controller methods. 100 | } 101 | ``` 102 | 103 | You can also use Facade for the services. 104 | 105 | - Add transformers at `app/Transformers` directory or use the command `php artisan make:transformer {name}`. 106 | 107 | ```php 108 | (int) $user->id, 127 | 'email' => (string) $user->email, 128 | ]; 129 | } 130 | } 131 | ``` 132 | 133 | - Render JSON in controllers 134 | 135 | ```php 136 | accounts = $accounts; 155 | } 156 | 157 | /** 158 | * List of all users. 159 | * 160 | * @return \Illuminate\Http\JsonResponse 161 | */ 162 | public function index(): JsonResponse 163 | { 164 | $users = $this->accounts->getUsersWithPagination($request); 165 | 166 | return response()->json($users, Response::HTTP_OK); 167 | } 168 | } 169 | ``` 170 | 171 | - Exception message, status code and details can be displayed by declaring these as methods in an exception class. 172 | 173 | ```php 174 | 222 | ``` 223 | 224 | - Get Current User 225 | 226 | ``` 227 | curl --request GET 'http://127.0.0.1:8000/auth' \ 228 | --header 'Content-Type: application/json' \ 229 | --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC8xMjcuMC4wLjE6ODAwMFwvYXV0aCIsImlhdCI6MTYzNDI2MTQzNSwiZXhwIjoxNjM0MjY1MDM1LCJuYmYiOjE2MzQyNjE0MzUsImp0aSI6IlVzVm1PZk52dTBrOTZFYk4iLCJzdWIiOjEsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.xjvzoFCkxlB_k2z0R0zkeatDDRU0hAbRFMETAEZBsss' 230 | ``` 231 | 232 | ### Using CORS 233 | 234 | Please check [fruitcake/laravel-cors](https://github.com/fruitcake/laravel-cors) in Github for the usage details. 235 | 236 | ### Todo 237 | 238 | - [ ] Move all the extended features inside a package. 239 | 240 | ### Issues 241 | 242 | Please create an issue if you find any bug or error. 243 | 244 | ### Contribution 245 | 246 | Feel free to make a pull request if you want to add anything. 247 | 248 | ### License 249 | 250 | MIT 251 | -------------------------------------------------------------------------------- /resources/views/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/munza/lumen-api-starter/e72020dda79c6174a73b8ac89463f8754028d26a/resources/views/.gitkeep -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | get('/', function () use ($router) { 20 | $data = [ 21 | 'name' => config('app.name'), 22 | 'version' => config('app.version'), 23 | 'framework' => $router->app->version(), 24 | 'environment' => config('app.env'), 25 | 'debug_mode' => config('app.debug'), 26 | 'timestamp' => Carbon::now()->toDateTimeString(), 27 | 'timezone' => config('app.timezone'), 28 | ]; 29 | 30 | return response()->json($data, Response::HTTP_OK); 31 | }); 32 | 33 | $router->post('/auth', 'AuthController@store'); 34 | $router->group(['middleware' => 'auth:api', 'prefix' => 'auth'], function ($router) { 35 | $router->get('/', 'AuthController@show'); 36 | $router->put('/', 'AuthController@update'); 37 | $router->delete('/', 'AuthController@destroy'); 38 | }); 39 | 40 | $router->group(['middleware' => 'auth:api', 'prefix' => 'users'], function ($router) { 41 | $router->get('/', 'UserController@index'); 42 | $router->post('/', 'UserController@store'); 43 | $router->get('/{id:[0-9]+}', 'UserController@show'); 44 | $router->put('/{id:[0-9]+}', 'UserController@update'); 45 | $router->patch('/{id:[0-9]+}', 'UserController@update'); 46 | $router->delete('/{id:[0-9]+}', 'UserController@destroy'); 47 | }); 48 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 18 | $this->assertResponseOk(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 |