Coding Talk#03
Register Login
Flutter + Lumen
MEMBUAT
REST API
Install Composer
1. Buat dua buah folder
2. Masuk ke folder lumen dan buka terminal
composer create-project --prefer-dist laravel/lumen fluttertalk03
cd fluttertalk03
code .
baris 1 : membuat project lumen dengan nama fluttertalk03
baris 2 : masuk ke dalam project
baris 3 : membuka project dengan vscode
Membuat Project
Connect Ke Database
1. Buat Database di mysql dengan nama : fluttertalk03
2. Update file .env sesuai pengaturan mysql
Membuat Tabel
php artisan make:migration CreateUsers
1. Buat migration user dengan ketikan di terminal
2. Buka File Database/Migration/
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('username');
$table->string('password');
$table->string('email');
$table->timestamps();
});
2020_02_18_151506_create_users.php
Tambahkan pada fungsi up
3. Jalankan fungsi migrasi dengan ketikan di terminal
php artisan migrate:refresh
Ubah Model User
App/User.php
protected $fillable = [
'username', 'password', 'email',
];
aktifkan eloquent di boostrap/app.php baris 24 & 26
app/ResponseHandler.php
Buat Model Response
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class ResponseHandler extends Model
{
public function send($status = 200, $message, $data = []) {
return response()->json([
'status' => $status,
'message' => $message,
'data' => $data
]);
}
public function notFound($message) {
return response()->json([
'status' => 404,
'message' => "$message not found",
]);
}
public function internalError() {
return response()->json([
'status' => 500,
'message' => "Internal server error",
]);
}
public function exists($message) {
return response()->json([
'status' => 400,
'message' => "$message already exists",
]);
}
public function validateError($errors) {
return response()->json([
'status' => 422,
'message' => 'Validation errors',
'error' => $errors
]);
}
public function badCredentials() {
return response()->json([
'status' => 401,
'message' => 'Username or password is wrong',
]);
}
}
app/http/Resources/UserResource.php
Buat Resources
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class UserResource extends Resource
{
public function toArray($request)
{
return [
'id' => $this->id,
'username' => $this->username,
'email' => $this->email,
];
}
}
app/http/AuthController.php
Buat Controller
<?php
namespace App\Http\Controllers;
use App\Http\Resources\UserResource;
use App\ResponseHandler;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Arr;
class AuthController extends Controller
{
private $user;
private $respHandler;
public function __construct()
{
$this->user = new User();
$this->respHandler = new ResponseHandler();
}
public function register(Request $request)
{
$validate = Validator::make($request->all(), [
'username' => 'required|string',
'password' => 'required|string',
'email' => 'required|string|email'
]);
if ($validate->fails()) {return $this->respHandler->validateError($validate->errors());}
$input = $request->all();
if (!$this->user->where('username', $input['username'])->where('email', $input['email'])->first()) {
$input['password'] = Hash::make($input['password']);
$user = $this->user->create($input);
return $this->respHandler->send(201, "Register Success", new UserResource($user));
} else {
return $this->respHandler->exists("Users");
}
}
public function login(Request $request)
{
$validate = Validator::make($request->all(), [
'username' => 'required|string',
'password' => 'required'
]);
if ($validate->fails()) {return $this->respHandler->validateError($validate->errors());}
$input = $request->all();
$user = $this->user->where('username', $input["username"])->first();
if ($user) {
if (Hash::check($input['password'], $user->password)) {
return $this->respHandler->send(200, "Berhasil login", new UserResource($user));
} else {
return $this->respHandler->badCredentials();
}
} else {
return $this->respHandler->notFound("Users");
}
}
}
$router->group([
'prefix' => 'auth'
], function() use ($router) {
$router->post('/register', 'AuthController@register');
$router->post('/login', 'AuthController@login');
});
Buat Route
route/web.php
TESTING
REST API
RUN SERVER
1. cek ip local dengan cara mengetikan di terminal : ipconfig
2. Jalankan server lumen dengan perintah
php -S 192.168.1.11:8000 -t public
POSTMAN
Test : Register
192.168.1.11:8000/auth/register
Test : Login
192.168.1.11:8000/auth/login
FLUTTER
http://flutter.id/api/fluttertalk03/public
PrimaryButton
import 'package:flutter/material.dart';
class PrimaryButton extends StatelessWidget {
Color color;
String text;
Function onClick;
PrimaryButton({
@required this.color,
@required this.text,
@required this.onClick
});
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: onClick,
color: color,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
child: Text(
text,
style: TextStyle(
color: Colors.white,
fontSize: 15,
fontWeight: FontWeight.bold
)
),
);
}
}
InputField
import 'package:flutter/material.dart';
class InputField extends StatelessWidget {
TextEditingController controller;
TextInputAction action;
TextInputType type;
String hintText;
bool secureText;
bool readOnly;
Function onTap;
InputField({
this.controller, this.action,
this.type, this.hintText, this.secureText = false,
this.onTap, this.readOnly = false
});
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.grey.withOpacity(0.2),
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(6),
),
child: Padding(
padding: const EdgeInsets.only(left: 10, right: 10),
child: TextField(
controller: controller,
onTap: () => onTap != null ? onTap() : {},
// textInputAction: action,
textInputAction: TextInputAction.next,
keyboardType: type,
obscureText: secureText,
readOnly: readOnly,
decoration: InputDecoration(
hintText: hintText,
border: InputBorder.none,
),
),
)
);
}
}
endpoint.dart
class Endpoint{
static String _baseURL = "http://flutter.id/api/fluttertalk03/public";
static String register = "${_baseURL}/auth/register";
static String login = "${_baseURL}/auth/login";
}
auth_model.dart
class auth_model {
int status;
String message;
Data data;
auth_model({this.status, this.message, this.data});
auth_model.fromJson(Map<String, dynamic> json) {
status = json['status'];
message = json['message'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status'] = this.status;
data['message'] = this.message;
if (this.data != null) {
data['data'] = this.data.toJson();
}
return data;
}
}
class Data {
int id;
String username;
String email;
Data({this.id, this.username, this.email});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
username = json['username'];
email = json['email'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['username'] = this.username;
data['email'] = this.email;
return data;
}
}
toast_utils.dart
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
class ToastUtils {
static Future<void> show(String message) async {
Fluttertoast.showToast(
msg: message,
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIos: 1,
backgroundColor: Colors.black87,
textColor: Colors.white,
fontSize: 16.0
);
}
}
Coding Talk#03 Register Login with Flutter + Lumen
By Maulana Ilham
Coding Talk#03 Register Login with Flutter + Lumen
Register Login with Flutter + Lumen
- 1,942