A starter template to develop API with Lumen 8.
- flipbox/lumen-generator@^8.0
- fruitcake/laravel-cors@^2.0
- spatie/laravel-fractal@^5.8
- spatie/laravel-query-builder@^3.6
- tymon/jwt-auth@^1.0
- Clone the Repo:
git clone git@github.com:munza/lumen-api-starter.git
git clone https://github.com/munza/lumen-api-starter.git
cd lumen-api-starter
- SSH into the Docker container with
make ssh
and run the following.composer create-project
php artisan key:generate
php artisan jwt:secret
php artisan migrate
- Exit from Docker container with
CTRL+C
orexit
. - Rename
docker-compose.local.yaml
todocker-compose.overridee.yaml
- Start the local development server with
make up
. - Run
make
to see available commands.
make ssh
php artisan ti
App\Models\User::factory()->create(['email' => 'admin@localtest.me', 'password' => 'password'])
- Edit
.env
file for environment variables. - Edit the files in
config
directory for application configuration.
Always ssh
into Docker container app
by running make ssh
before executing any artisan
commands.
-
Add endpoint in
routes/web.php
.$router->group(['middleware' => 'auth:api'], function ($router) { $app->get('/users', 'UserController@index'); });
-
Add controller with
php artisan make:controller {name}
command -
Add model at
php artisan make:model {name}
. You can use-m
flag to add migration file and-f
flag for factory file. -
Add service at
app
directory.<?php namespace App; class Accounts { // Add service methods. }
-
Load the service in controller.
<?php namespace App\Http\Controllers; use App\Accounts; class UserController extends Controller { /** * Controller constructor. * * @param \App\Accounts $accounts */ public function __construct(Accounts $accounts) { $this->accounts = $accounts; } // Add controller methods. }
You can also use Facade for the services.
-
Add transformers at
app/Transformers
directory or use the commandphp artisan make:transformer {name}
.<?php namespace App\Transformers; use App\User; use League\Fractal\TransformerAbstract; class UserTransformer extends TransformerAbstract { /** * Transform object to array. * * @param \App\User $user * @return array */ public function transform(User $user): array { return [ 'id' => (int) $user->id, 'email' => (string) $user->email, ]; } }
-
Render JSON in controllers
<?php namespace App\Http\Controllers; use App\Accounts; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; class UserController extends Controller { /** * Controller constructor. * * @param \App\Accounts $accounts */ public function __construct(Accounts $accounts) { $this->accounts = $accounts; } /** * List of all users. * * @return \Illuminate\Http\JsonResponse */ public function index(): JsonResponse { $users = $this->accounts->getUsersWithPagination($request); return response()->json($users, Response::HTTP_OK); } }
-
Exception message, status code and details can be displayed by declaring these as methods in an exception class.
<?php namespace App\Exceptions; use Symfony\Component\HttpKernel\Exception\HttpException; class CustomException extends HttpException { public function getMessage(): string { return 'Custom message'; } public function getStatusCode(): int { return 500; } public function getDetails(): ?array { return []; } }
- Create Bearer Token
curl --request POST 'http://127.0.0.1:8000/auth' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "admin@localtest.me",
"password": "password"
}'
Example Bearer Token -
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC8xMjcuMC4wLjE6ODAwMFwvYXV0aCIsImlhdCI6MTYzNDI2MTQzNSwiZXhwIjoxNjM0MjY1MDM1LCJuYmYiOjE2MzQyNjE0MzUsImp0aSI6IlVzVm1PZk52dTBrOTZFYk4iLCJzdWIiOjEsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.xjvzoFCkxlB_k2z0R0zkeatDDRU0hAbRFMETAEZBsss
Bearer Token need to passed in the request header as
Authorization: Bearer <token>
- Get Current User
curl --request GET 'http://127.0.0.1:8000/auth' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC8xMjcuMC4wLjE6ODAwMFwvYXV0aCIsImlhdCI6MTYzNDI2MTQzNSwiZXhwIjoxNjM0MjY1MDM1LCJuYmYiOjE2MzQyNjE0MzUsImp0aSI6IlVzVm1PZk52dTBrOTZFYk4iLCJzdWIiOjEsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.xjvzoFCkxlB_k2z0R0zkeatDDRU0hAbRFMETAEZBsss'
Please check fruitcake/laravel-cors in Github for the usage details.
- Move all the extended features inside a package.
Please create an issue if you find any bug or error.
Feel free to make a pull request if you want to add anything.
MIT