LAPORAN PRAKTIKUM ALIKASI MOBILE 4

Navigation & Routing : Multiple Screen

Tujuan

  • Membuat aplikasi yang dapat berpindah dari halaman satu ke halaman lain
  • Membuat aplikasi yang dapat mengirim dan menerima data dari halaman lain

Alat

Computer / laptop yang telah terinstall lingkungan Flutter development

Teori

Navigation dan Routing Flutter : Navigation merupakan proses berpindah dari satu halaman (screen/page) ke halaman lain dalam aplikasi Flutter, misalnya perpindahan dari halaman login ke halaman utama, atau dari halaman produk ke halaman detail produk. Navigasi pada Flutter menggunakan widget Navigator yang bekerja dengan konsep stack.

Routing : merupakan sistem untuk mendefinisikan dan mengelola jalur halaman (routes) dalam aplikasi Flutter agar dapat memanggil halaman menggunakan nama route tanpa membuat instance baru setiap kali.

Jenis – jenis Routing pada Flutter :

  • Navigator (Anonymous Routes)
  • Named Routes
  • Generated Routes
  • Router / Navigator 2.0

Langkah – Langkah Kerja

  1. Multiple Screen
  • Buat file dart baru.
  • Buat class menggunakan StatelessWidget dengan nama MyNav.
  • Inisialisasi route pada MaterialApp.

Contoh Kode Program Lengkap Navigation & Routing:

 import 'package:flutter/material.dart';

void main() => runApp(const MyNav());

class MyNav extends StatelessWidget {
  const MyNav({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: '/',
      routes: {
        '/': (context) => const Product(),
        '/product_detail': (context) => const ProductDetail(),
      },
    );
  }
}

class Product extends StatelessWidget {
  const Product({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Product')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pushNamed(context, '/product_detail');
          },
          child: const Text('Go to Product Detail'),
        ),
      ),
    );
  }
}

class ProductDetail extends StatelessWidget {
  const ProductDetail({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Product Detail')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: const Text('Back to Product'),
        ),
      ),
    );
  }
}

Output Navigation & Routing:

2. Mengirim dan Menerima Data antar Halaman

  • Buat file dart baru dan inisialisasi route pada MaterialApp.
  • Buat class baru: HomePageMyProfile, dan MyProduct.
  • Pada HomePage, kirim data ke halaman lain melalui constructor dan named route.

Implementasi pengiriman data menggunakan constructor dan named routes dengan kode berikut:

   import 'package:flutter/material.dart';

void main() => runApp(MyNav());

class MyNav extends StatelessWidget {
  const MyNav({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: '/',
      routes: {
        '/': (context) => const HomePage(),
        '/product': (context) => const MyProduct(),
      },
    );
  }
}

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Home Page')),
      body: Center(
        child: Row(
          children: [
            // Mengirim data dengan constructor
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context, 
                  MaterialPageRoute(
                    builder: (context) => const MyProfile(id: 001, name: 'Devia Puji Astuti'),
                  ),
                );
              }, 
              child: const Text('Profile'),
            ), 
            // Mengirim data dengan named routes
            ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(
                  context, 
                  '/product',
                  arguments: {'id': 1, 'name': 'sepatu'},
                );
              }, 
              child: const Text('Product'),
            ),
          ],
        ),
      ),
    );
  }
}

class MyProfile extends StatelessWidget {
  final int id;
  final String name;
  const MyProfile({super.key, required this.id, required this.name});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Profile')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('ID: $id'),
            Text('Name: $name'),
          ],
        ),
      ),
    );
  }
}

class MyProduct extends StatelessWidget {
  const MyProduct({super.key});

  @override
  Widget build(BuildContext context) {
    final args = ModalRoute.of(context)!.settings.arguments as Map?;
    final int id = args?['id'] ?? 0;
    final String name = args?['name'] ?? 'Unknown';

    return Scaffold(
      appBar: AppBar(title: const Text('Product')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Product ID: $id'),
            Text('Product Name: $name'),
          ],
        ),
      ),
    );
  }
}

dengan outputnya:

LAPORAN PRAKTIKUM APLIKASI MOBILE 3

Input Widgets dan Basic Form

GitHub

1. Tujuan

Tujuan praktikum ini yaitu pengguna mampu membuat membuat basic form untuk menerima inputan dari keyboard dan mengelola inputan :

  • Membuat beberapa input widgets
  • Membuat dan mengontrol inputan dari user
  • Menambahkan informasi error ketika memasukkan input yang tidak sesuai

2. Alat yang Digunakan

  • IDE (Visual Studio Code)
  • Flutter & Dart

3. Teori

Basic Form

Basic Form merupakan widget yang berfungsi sebagai inputan nilai seperti TextField, TextFormField, CheckBox, Switch, Dropdown, Radio, Dialog, DatePicker, BottomSheet, Snackbar dan lain-lain. Basic Form digunakan untuk validasi dan mengelola inputan dari berbagai field. Form ini akan memberikan tampilan inputan kemudian inputan akan diperiksa apakah sudah sesuai dengan aturan atau format yang ditetapkan, selanjtunya data inputan akan diambil nilainya setelah proses pengecekan selesai dilakukan.

Text Field

TextField adalah widget yang digunakan untuk memasukkan text oleh pengguna, widget ini biasanya digunakan untuk membuat form inputan seperti form login, pencarian dll. fiturnya : Menerima input dari keyboard, Memiliki property yang lengkap style, decoration, dan jenis inputan dan Dapat mengelola teks menggunakan TextEditingController

Text Form Field

TextFormField adalah widget versi lengkap dari TextField yang secara otomatis terintegrasi dengan logika validasi dan manajemen state dari sebuah form Fitur TextFormField antara lain : Menerima input teks dari keyboard, Memiliki properti validator yang berfungsi untuk memeriksa apakah input sudah sesuai dengan aturan yang ditentukan, Menampilkan pesan error secara otomatis di bawah field jika validasi gagal, dan Berinteraksi dengan FormState untuk melakukan validasi secara kolektif dengan validate() method.

LANGKAH LANGKAH

A. Basic Form TextField

Buat file dart baru dengan nama form-textfield.dart di dalam folder lib
Buat sebuah tampilan basic form dengan menggunakan widget TextField untuk inputan dan ElevatedButton sebagai tombol event listener

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Basic Form'),
        ),
        body: const MyForm(),
      ),
    );
  }
}

class MyForm extends StatefulWidget {
  const MyForm({super.key});

  @override
  State<MyForm> createState() => _MyFormState();
}

class _MyFormState extends State<MyForm> {
  String _inputText = '';
  final _textEditingController = TextEditingController();

  @override
  void dispose() {
    _textEditingController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(20.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          const Text('Masukkan nama anda :'),
          const SizedBox(
            height: 10,
          ),
          TextField(
            decoration: const InputDecoration(
                labelText: 'Nama Lengkap',
                hintText: 'masukan nama lengkap anda',
                border: OutlineInputBorder(),
                prefixIcon: Icon(Icons.person)),
            controller: _textEditingController,
            keyboardType: TextInputType.text,
            onChanged: (text) {
              print('Sedang mengetik teks : ,$text');
            },
          ),
          const SizedBox(
            height: 20,
          ),
          ElevatedButton(
            onPressed: () {
              String inputText = _textEditingController.text;
              ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Nama anda adalah: $inputText')));
              setState(() {
                _inputText = _textEditingController.text;
              });
            },
            style: ElevatedButton.styleFrom(
                backgroundColor: Colors.amber, foregroundColor: Colors.black),
            child: const Text('Tampilkan Nama'),
          ),
          const SizedBox(
            height: 20,
          ),
          Text(
            'Nama anda: $_inputText',
            style: const TextStyle(fontSize: 20),
          ),
        ],
      ),
    );
  }
}
  • MyFormState: membuat variabel TextEditingController yang berguna untuk mengambil inputan dari pengguna, lalu membuat variabel yang membersihkan teks inputan
  • TextField: menambahkan controller properti jenis inputan agar bisa di lakukan aksi input dari pengguna
  • ElevatedButton: pada bagian onPressed ditambahkan program agar tombol bisa ditekan dan menampilkan inputan pengguna dari textfield ke dalam widget snackbar (yang biasanya berada di paling bawah halaman), bisa juga menampilkan inputan ke dalam suatu area teks

ketika memasukkan nama misalnya : Devia Puji Astuti

B. Basic Form TextFormField

Buat file dart baru dengan nama form-textformfield.dart di dalam folder libBuat form inputan pengguna menggunakan widget TextFormField dan ElevatedButton beserta handling jika inputan tidak sesuai

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Basic Form TextFormField"),
        ),
        body: const MyFormText(),
      ),
    );
  }
}

class MyFormText extends StatefulWidget {
  const MyFormText({super.key});

  @override
  State createState() => _MyFormTextState();
}

class _MyFormTextState extends State {
  final _formKey = GlobalKey<FormState>();
  final _nameController = TextEditingController();
  final _emailController = TextEditingController();

  @override
  void dispose() {
    _nameController.dispose();
    _emailController.dispose();
    super.dispose();
  }

  void _submitForm() {
    if (_formKey.currentState!.validate()) {
      String name = _nameController.text;
      String email = _emailController.text;

      ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Validasi $name, $email Berhasil')));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            const SizedBox(
              height: 10,
            ),
            TextFormField(
              controller: _nameController,
              decoration: const InputDecoration(
                  labelText: "Nama : ", border: OutlineInputBorder()),
              validator: (value) {
                if (value == null || value.isEmpty) {
                  return 'Masukkan nama anda';
                }
                return null;
              },
            ),
            const SizedBox(
              height: 10,
            ),
            TextFormField(
              controller: _emailController,
              decoration: const InputDecoration(
                  labelText: "Email : ", border: OutlineInputBorder()),
              validator: (value) {
                if (value == null || value.isEmpty) {
                  return 'Masukkan email anda ';
                }
                if (!value.contains('@')) {
                  return 'Email tidak valid';
                }
                return null;
              },
            ),
            const SizedBox(
              height: 10,
            ),
            SizedBox(
              width: double.infinity,
              child: ElevatedButton(
                  onPressed: _submitForm, child: const Text('Submit')),
            )
          ],
        ),
      ),
    );
  }
}
  • _MyFormTextState: membuat controller untuk textformfield bagian nama dan email, lalu membuat method yang menghapus inputan nama dan email dan membuat method yang berjalan ketika ElevatedButton di tekan
  • TextFormField: membuat handling pada textformfield berdasarkan inputan yang diberikan pengguna kosong ataupun tidak sesuai dengan format biasanya
  • ElevatedButton: pada bagian onPressed ditambahkan method _submitform agar bisa menampilkan output Validasi Berhasil berupa Snackbar

dalam pengisiannya Ketika ElevatedButton ditekan dan TextField kosong dan ketika ElevatedButton ditekan dan TextField salah format maka nanti hasilnya akan merah

ketika diisi dengan format yang benar maka outputnya seperti dibawah ini.

LAPORAN PRAKTIKUM APLIKASI MOBILE 2

GitHub

Tujuan praktikum ini yaitu pengguna mampu menginstall lingkungan flutter development, stateless dan statefull widget dan basic widgets flutter :

  • Pengguna mampu menyiapkan lingkungan development flutter seperti install sdk-flutter, git, android SDK, IDE dll
  • Pengguna mampu membuat stateless dan statefull widget flutter
  • Pengguna mampu membuat contoh basic widgets flutter

Alat yang digunakan

  • IDE (Visual Studio Code)
  • Laptop yang sudah terinstal GIT

Langkah-langkah

A. Instalasi Lingkungan Flutter

Install Visual Studio lewat link berikut Visual Studio kemudian pada proses instalasinya centang pada bagian Desktop development with C++

Install Android Studio lewat link berikut Android Studio

Install SDK-Flutter lewat link berikut SDK-Flutter (sesuai dengan pc masing masing)

Ekstrak hasil download tadi ke direktori yang diinginkan

Tambahkan path (ditambah dengan \bin) ke Environment control panel

    Cek setup flutter development dengan mengetikkan perintah flutter doctor di dalam command prompt (disini instalasi android studio belum selesai sepenuhnya)

    B. Project Command Prompt

    Buka command prompt lalu ketikkan perintah flutter create hai untuk membuat project flutter bernama hai

    Masuk ke dalam project yang dibuat tadi dengan cd hai lalu jalankan project dengan flutter run dan memilih dijalankan lewat Chrome

    LAPORAN PRAKTIKUM APLIKASI MOBILE 1

    Setup Environment, Dart Dasar dan OOP Dart

    GitHub

    1.Pengertian

    Dart adalah bahasa pemrograman berorientasi objek (OOP) yang dikembangkan oleh Google dan pertama kali diperkenalkan pada tahun 2011 oleh Lars Bak dan Kasper. Dirancang dengan sintaks mirip C, Java, dan JavaScript, Dart mudah dipelajari oleh pengembang yang sudah familiar dengan bahasa-bahasa tersebut. Bahasa ini mendukung pemrograman multi-paradigma—mulai dari fungsional, imperatif, hingga reflektif—serta memiliki fitur seperti class-based, garbage collection, mixins, generics, dan type inference. Dart unggul dalam kinerja karena mendukung kompilasi Just-in-Time (JIT) untuk pengembangan cepat dan Ahead-of-Time (AOT) untuk performa optimal pada saat runtime.

    2. Instalasi

    Sebelum install SDK Dart pastikan arsitektur hardware telah memenuhi persyaratanminimum, Adapun persyaratan minimum yang dibutuhkan untuk install SDK Dart seperti gambar berikut:

    Untuk menginstall SDK Dart dapat menggunakan beberapa cara yaitu dapat menggunakan Chocolatey atau dapat langsung download file SDK dalam bentuk ZIP kemudian di extract pada perangkat. Kita akan menginstall menggunakan Extract SDK Dart ZIP

    Download versi stabil sesuai dengan system operasi pada computer

    • Selanjutnya extract SDK Dart yang telah di zip

    Agar dart dapat dijalankan secara global maka perlu menambahkan pada PATH
    Environment, berikut Langkah-langkah menambahkan PATH. Kemudian buka path untuk mengatur agar dart dapat dijalankan, buka Edit the system Environment variable dan klik Environment Variables maka akan muncul tampilan seperti berikut

    Pilih Path → Edit dan tambahkan Path dari SDK Dart C:\dart-sdk (tempat menyimpan hasil install dart sebelumnya). Kemudian cek pada cmd apakah dart terseebut sudah terinstall atau belum

    jika sudah menghasilkan output seperti ini maka sudah bisa digunakan.

    lanjut masuk kedalam vs code, dan instal “Dart” di dalamnya.

    lanjut, kembali ke cmd dan buat proyek untuk pengujian. disini saya membuat folder dengan nama “halo”

    untuk menjalankannya gunakan code berupa “cd halo” dan “dart run” sehingga akan menghasilkan output seperti dibawah ini.

    dan menghasilkan output : “Hello world: 42!”

    LAPORAN PRAKTIKUM 11

    GitHub

    Tutorial RESTful API menggunakan POSTMAN pada project Laravel

    Komponen-komponen utama API adalah sebagai berikut:

    1. Request (Permintaan)
      • URL/Endpoint
      • HTTP Method
      • Headers
      • Body/Payload
    2. Response (Respon)
      • Status Code
      • Headers
      • Body/Data

    RESTful API (Representational State Transfer) adalah arsitektur untuk merancang web services. REST bukan protokol atau standar, melainkan seperangkat prinsip desain. RESTful API adalah jenis antarmuka yang memungkinkan dua sistem komputer berkomunikasi secara aman dan efisien melalui internet dengan mengikuti prinsip arsitektur REST—yakni client‑server, stateless, mampu cache, dan menggunakan interface yang seragam dimana setiap sumber daya diidentifikasi lewat URI dan dimanipulasi menggunakan metode HTTP seperti GET, POST, PUT, DELETE. Representasi data—biasanya dalam JSON atau XML—dipindahkan sebagai “state” dari sumber daya, sementara server tidak menyimpan informasi terkait status klien antar permintaan, sehingga memudahkan skalabilitas dan integrasi. Desain ini menjadikan RESTful API ringan, mudah dipelajari, dan sangat ideal untuk aplikasi web maupun mobile modern

    Prinsip REST API:

    • Client-Server Architecture: Client dan server terpisah dan dapat berkembang secara independen.
    • Stateless: Setiap request harus berisi semua informasi yang diperlukan server untuk memproses request tersebut.
    • Cacheable: Response harus dapat di-cache untuk meningkatkan performa.
    • Uniform Interface: Interface yang konsisten antara client dan server.
    • Layered System: Arsitektur berlapis yang memungkinkan scalability.
    • Code on Demand (Opsional): Server dapat mengirim kode executable ke client

    Langkah-Langkah

    Berikut adalah langkah-langkah untuk menerpakan RESTful API pada project Laravel menggunakan POSTMAN

    Pada tutorial ini, kita akan membuat sebuah project CRUD sederhana menggunakan Laravel. Buat sebuah project laravel baru atau di project laravel yang sudah ada (pada tutorial ini kita akan membuat project laravel baru dan akan membuat project CRUD sederhana)

    Pertama, kita akan membuat migrasi databasenya. untuk membuat migrasi, gunakan kode berikut di terminal:

    php artisan make:model Product

    Kemudian isi dengan kode berikut:

    class Product extends Model 
    { 
        protected $fillable = [ 
            'name', 'description', 'price', 'stock' 
        ]; 
         
        protected $casts = [ 
            'price' => 'decimal:2' 
        ]; 
    }

    Kemudian, kita buat API Routes untuk website kita. ketik di terminal kode berikut:

    php artisan install:api

    Lalu, buat di file routes/api.php kode berikut:

    Route::apiResource('products', ProductController::class); 
      
    // manual: 
    Route::get('products', [ProductController::class, 'index']); 
    Route::post('products', [ProductController::class, 'store']); 
    Route::get('products/{product}', [ProductController::class, 'show']); 
    Route::put('products/{product}', [ProductController::class, 'update']); 
    Route::delete('products/{product}', [ProductController::class, 'destroy']);

    Setelah itu, buat controller bernama ProductController dengan kode berikut:

    php artisan make:controller ProductController --api

    Setelah itu, isi dengan kode berikut di controller:

    class ProductController extends Controller 
    { 
        public function index() 
        { 
            $products = Product::all(); 
            return response()->json([ 
                'status' => 'success', 
                'data' => $products 
            ]); 
        } 
         
        public function store(Request $request) 
        { 
            $validated = $request->validate([ 
                'name' => 'required|string|max:255', 
                'description' => 'required|string', 
                'price' => 'required|numeric|min:0', 
                'stock' => 'required|integer|min:0' 
            ]); 
             
            $product = Product::create($validated); 
             
            return response()->json([ 
                'status' => 'success', 
                'message' => 'Product created successfully', 
                'data' => $product 
            ], 201); 
        } 
         
        public function show(Product $product) 
        { 
            return response()->json([ 
                'status' => 'success', 
                'data' => $product 
            ]); 
        } 
         
        public function update(Request $request, Product $product) 
        { 
            $validated = $request->validate([ 
                'name' => 'sometimes|string|max:255', 
                'description' => 'sometimes|string', 
                'price' => 'sometimes|numeric|min:0', 
                'stock' => 'sometimes|integer|min:0' 
            ]); 
             
            $product->update($validated); 
             
            return response()->json([ 
                'status' => 'success', 
                'message' => 'Product updated successfully', 
                'data' => $product 
            ]); 
        } 
         
        public function destroy(Product $product) 
        { 
            $product->delete(); 
             
            return response()->json([ 
                'status' => 'success', 
                'message' => 'Product deleted successfully' 
            ]); 
        } 
    }

    Kemudian, kita akan membuat API Resource. Fitur yang memungkinkan untuk mentransformasi model data atau collection menjadi format JSON yang konsisten dan mudah dikustomisasi untuk API response. API Resource berfungsi sebagai layer transformasi antara model Eloquent dan JSON response yang dikirim ke client sehingga dapat digunakan untuk Mengontrol format output JSON, Menyembunyikan field sensitive, Menambahkan field computed dan Membuat response yang konsisten.

    Ketik kode berikut di terminal:

    php artisan make:resource ProductResource

    kemudian, isi dengan kode berikut:

    class ProductResource extends JsonResource 
    { 
        public function toArray($request) 
        { 
            return [ 
                'id' => $this->id, 
                'name' => $this->name, 
                'description' => $this->description, 
                'price' => $this->price, 
                'stock' => $this->stock, 
                'created_at' => $this->created_at->format('Y-m-d H:i:s'), 
                'updated_at' => $this->updated_at->format('Y-m-d H:i:s') 
            ]; 
        } 
    }

    Untuk menggunakan resource yang telah dibuat di controller, ubah function index() dan show() di ProductController seperti berikut:

    public function index() 
    { 
        $products = Product::all(); 
        return ProductResource::collection($products); 
    } 
      
    public function show(Product $product) 
    { 
        return new ProductResource($product); 
    }

    Selanjutnya, kita akan membuat validasi dan error handling. Pertama, kita akan membuat Form Request Validation. Gunakan kode berikut di terminal:

    php artisan make:request StoreProductRequest
    

    Kemudian, masukkan kode berikut di file app/Http/Requests/StoreProductRequest.php

    class StoreProductRequest extends FormRequest 
    { 
        public function authorize() 
        { 
            return true; 
        } 
         
        public function rules() 
        { 
            return [ 
                'name' => 'required|string|max:255', 
                'description' => 'required|string', 
                'price' => 'required|numeric|min:0', 
                'stock' => 'required|integer|min:0' 
            ]; 
        } 
         
        public function messages() 
        { 
            return [ 
                'name.required' => 'Nama produk wajib diisi', 
                'price.min' => 'Harga tidak boleh negatif' 
            ]; 
        } 
    }

    Lalu, tambahkan kode berikut di app/Exceptions/Handler.php untuk menangani Exception:

    public function render($request, Throwable $exception) 
    { 
    if ($request->wantsJson()) { 
    if ($exception instanceof ValidationException) { 
    return response()->json([ 
    'status' => 'error', 
    'message' => 'Validation failed', 
    'errors' => $exception->errors() 
    ], 422); 
    } 
    if ($exception instanceof ModelNotFoundException) { 
    return response()->json([ 
    'status' => 'error', 
    'message' => 'Resource not found' 
    ], 404); 
    } 
    } 
    return parent::render($request, $exception); 
    } 

    Untuk mengakses api yang telah kita buat, kita perlu menggunakan aplikasi POSTMAN. Install terlebih dahulu POSTMAN

    Pertama, install terlebih dahulu json-server menggunakan npm. Install menggunakan kode berikut:

    npm install -g json-server

    Jika berhasil, cek dengan kode berikut:

    json-server ---version

    Jika sudah, maka akan seperti berikut:

    Setelah itu, download Postman di link : https://www.postman.com/downloads/

    Untuk mengakses API yang telah kita buat tadi, Pertama-tama hidupkan terlebih dahulu web servernya menggunakan kode berikut:

    php artisan serve

    LAPORAN PRAKTIKUM 10

    Untuk praktikum ini, kita akan membuat sistem akademik sederhana dengan relationship:

    • Student belongs to Major (Many-to-One)
    • Student belongs to many Subject through pivot table (Many-to-Many)
    • Major has many Student (One-to-Many)
    • Subject belongs to many Student through pivot table (Many-to-Many)

    Buat project baru dengan nama laravel-relationship, selanjutnya buat migrasi database.

    A. Migration untuk tabel majors

    Buat migrasi database dengan menggunakan command php artisan make:migration create_majors_table. Kemudian tambahkan kode berikut di function up()

    Schema::create('majors', function (Blueprint $table) {
                $table->id();
                $table->string('name');
                $table->timestamps();
            });
    B. Migration untuk tabel students

    Buat migrasi database dengan menggunakan command php artisan make:migration create_students_table. Kemudian tambahkan kode berikut di function up()

    Schema::create('students', function (Blueprint $table) {
                $table->id();
                $table->string('nim')->unique();
                $table->string('name');
                $table->text('address');
                $table->foreignId('major_id')->constrained('majors')->onDelete('cascade');
                $table->timestamps();
            });
    C. Migration untuk tabel subjects

    Buat migrasi database dengan menggunakan command php artisan make:migration create_subjects_table. Kemudian tambahkan kode berikut di function up()

    Schema::create('subjects', function (Blueprint $table) {
                $table->id();
                $table->string('name');
                $table->integer('sks');
                $table->timestamps();
            });
    D. Migration untuk tabel pivot student_subject

    Buat migrasi database dengan menggunakan command php artisan make:migration create_student_subject_table. Kemuidian tambahkan kode berikut di function up()

    Schema::create('student_subject', function (Blueprint $table) {
                $table->id();
                $table->foreignId('student_id')->constrained('students')->onDelete('cascade');
                $table->foreignId('subject_id')->constrained('subjects')->onDelete('cascade');
                $table->timestamps();
    
                // Mencegah duplikasi kombinasi student_id dan subject_id
                $table->unique(['student_id', 'subject_id']);
            });

    Setelah semua migrasi telah dibuat dan disave, jalankan migrasi database dengan perintah php artisan migrate


    Langkah selanjutnya adalah membuat model dengan relationship sesuai dengan migrasi database yang telah dibuat.

    A. Model Major

    Buat model major dengan perintah php artisan make:model Major pada terminal. Setelah itu, masukkan kode berikut di model:

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class Major extends Model
    {
        use HasFactory;
        protected $fillable = ['name'];
    
        //Relationship: One Major has many Student
        public function students()
        {
            return $this->hasMany(Student::class);
        }
    }
    B. Model Student

    Buat model student dengan perintah php artisan make:model Student pada terminal. Setelah itu, masukkan kode berikut di model:

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class Student extends Model
    {
        use HasFactory;
    
        protected $fillable = ['nim', 'name', 'address', 'major_id'];
    
        // Relationship: Many Students belong to one Major
        public function major()
        {
            return $this->belongsTo(Major::class);
        }
        
        // Relationship: Many Students belong to many Subjects
        public function subjects()
        {
            return $this->belongsToMany(Subject::class);
        }
    }
    C. Model Subject

    Buat model subject dengan perintah php artisan make:model Subject pada terminal. Setelah itu, masukkan kode berikut di model:

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class Subject extends Model
    {
        use HasFactory;
        protected $fillable = ['name', 'sks'];
    
        // Relationship: Many Subjects belong to many Students
        public function students()
        {
            return $this->belongsToMany(Student::class);
        }
    }

    Langkah selanjutnya adalah membuat seeder untuk memasukkan data ke database

    A. Seeder untuk Major

    Buat seeder dengan command php artisan make:seeder MajorSeeder, lalu isi seeder dengan kode berikut:

    <?php
    
    namespace Database\Seeders;
    
    use App\Models\Major;
    use Illuminate\Database\Console\Seeds\WithoutModelEvents;
    use Illuminate\Database\Seeder;
    
    class MajorSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         */
        public function run()
        {
            $majors = [
                ['name' => 'Teknik Informatika'],
                ['name' => 'Sistem Informasi'],
                ['name' => 'Teknik Komputer'],
                ['name' => 'Manajemen Informatika'],
            ];
    
            foreach ($majors as $major) {
                Major::create($major);
            }
        }
    }
    B. Seeder untuk Subject

    Buat seeder dengan command php artisan make:seeder SubjectSeeder, lalu isi seeder dengan kode berikut:

    <?php
    
    namespace Database\Seeders;
    
    use App\Models\Subject;
    use Illuminate\Database\Console\Seeds\WithoutModelEvents;
    use Illuminate\Database\Seeder;
    
    class SubjectSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         */
        public function run()
        {
            $subjects = [
                ['name' => 'Pemrograman Web', 'sks' => 3],
                ['name' => 'Database', 'sks' => 3],
                ['name' => 'Algoritma', 'sks' => 2],
                ['name' => 'Jaringan Komputer', 'sks' => 3],
                ['name' => 'Sistem Operasi', 'sks' => 2],
            ];
    
            foreach ($subjects as $subject) {
                Subject::create($subject);
            }
        }
    }
    C. Seeder untuk Student

    Buat seeder dengan command php artisan make:seeder StudentSeeder, lalu isi seeder dengan kode berikut:

    <?php
    
    namespace Database\Seeders;
    
    use App\Models\Student;
    use App\Models\Subject;
    use Illuminate\Database\Console\Seeds\WithoutModelEvents;
    use Illuminate\Database\Seeder;
    
    class StudentSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         */
        public function run()
        {
            $students = [
                ['nim' => '20210001', 'name' => 'Ahmad Rizki', 'address' => 'Jl. Merdeka No. 1', 'major_id' => 1],
                ['nim' => '20210002', 'name' => 'Siti Nurhaliza', 'address' => 'Jl. Sudirman No. 15', 'major_id' => 1],
                ['nim' => '20210003', 'name' => 'Budi Santoso', 'address' => 'Jl. Pahlawan No. 8', 'major_id' => 2],
                ['nim' => '20210004', 'name' => 'Dewi Kartika', 'address' => 'Jl. Diponegoro No. 22', 'major_id' => 2],
                ['nim' => '20210005', 'name' => 'Eko Prasetyo', 'address' => 'Jl. Gatot Subroto No. 11', 'major_id' => 3],
            ];
    
            foreach ($students as $studentData) {
                $student = Student::create($studentData);
    
                // Assign random subjects to each student
                $subjects = Subject::inRandomOrder()->take(rand(2, 4))->pluck('id');
                $student->subjects()->attach($subjects);
            }
        }
    }
    D. Update DatabaseSeeder

    Tambahkan kode berikut pada DatabaseSeeder

    <?php
    
    namespace Database\Seeders;
    
    use Illuminate\Database\Seeder;
    
    class DatabaseSeeder extends Seeder
    {
    
        public function run()
        {
            $this->call([
                MajorSeeder::class,
                SubjectSeeder::class,
                StudentSeeder::class,
            ]);
        }
    }

    setelah semua seeder dibuat dan di save, jalankan dengan perintah php artisan db:seed


    Langkah selanjutnya adlaah membuat controller pada model. Buat controller dengan perintah php artisan make:controller StudentController pada terminal. Kemudian tambahkan kode berikut di file controller:

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Models\Student;
    use App\Models\Major;
    use App\Models\Subject;
    use Illuminate\Http\Request;
    
    class StudentController extends Controller
    {
        public function index()
        {
            // Eager loading untuk menghindari N+1 problem
            $students = Student::with(['major', 'subjects'])->get();
            return view('students.index', compact('students', 'mostFrequentMajor'));
        }
    
        public function show($id)
        {
            $student = Student::with(['major', 'subjects'])->findOrFail($id);
            return view('students.show', compact('student'));
        }
    
        public function create()
        {
            $majors = Major::all();
            $subjects = Subject::all();
            return view('students.create', compact('majors', 'subjects'));
        }
    
        public function store(Request $request)
        {
            $request->validate([
                'nim' => 'required|unique:students',
                'name' => 'required',
                'address' => 'required',
                'major_id' => 'required|exists:majors,id',
                'subjects' => 'required|array',
                'subjects.*' => 'exists:subjects,id',
            ]);
    
            $student = Student::create($request->only(['nim', 'name', 'address', 'major_id']));
            $student->subjects()->attach($request->subjects);
    
            return redirect()->route('students.index')->with('success', 'Student created successfully');
        }
    
        public function edit($id)
        {
            $student = Student::with('subjects')->findOrFail($id);
            $majors = Major::all();
            $subjects = Subject::all();
            return view('students.edit', compact('student', 'majors', 'subjects'));
        }
    
        public function update(Request $request, $id)
        {
            $student = Student::findOrFail($id);
            $request->validate([
                'nim' => 'required|unique:students,nim,' . $student->id,
                'name' => 'required',
                'address' => 'required',
                'major_id' => 'required|exists:majors,id',
                'subjects' => 'required|array',
                'subjects.*' => 'exists:subjects,id',
            ]);
    
            $student->update($request->only(['nim', 'name', 'address', 'major_id']));
            $student->subjects()->sync($request->subjects);
    
            return redirect()->route('students.index')->with('success', 'Student updated successfully');
        }
    
        public function destroy($id)
        {
            $student = Student::findOrFail($id);
            $student->subjects()->detach(); // Remove all subject relationships
            $student->delete();
            
            return redirect()->route('students.index')->with('success', 'Student deleted successfully');
        }
    }

    Langkah selanjutnya yaitu membuat Route untuk menentukan bagaimana aplikasi merespons permintaan (request) pada URL tertentu. Ubah kode pada web.php menjadi kode berikut:

    <?php
    
    use App\Http\Controllers\StudentController;
    use Illuminate\Support\Facades\Route;
    
    Route::get('/', function () {
        return redirect()->route('students.index');
    });
    
    Route::resource('students', StudentController::class);

    LAPORAN PRAKTIKUM 9

    Lanjutan praktikum sebelumnya

    buka vscode dimana disana membuka folder yang kemarin laravel-auth lalu ketikkan pada bagian terminal untuk menambahkan didalam controller berupa UserController.

    selanjutkan tambahkan kode program berikut pada route web.

    use App\Http\Controllers\UserController;
    
    Route::resource('users', UserController::class);

    Sehingga jika dilihat pemetaan route php artisan route:list menjadi seperti gambar di bawah ini.

    File UserController Resource

    <?php 
    namespace App\Http\Controllers; 
     
    use Illuminate\Http\Request; 
     
    class UserController extends Controller 
    { 
        /** 
         * Display a listing of the resource. 
         * 
         * @return \Illuminate\Http\Response 
         */ 
        public function index() 
        { 
            // 
        } 
     
        /** 
         * Show the form for creating a new resource. 
         * 
         * @return \Illuminate\Http\Response 
         */ 
        public function create() 
        { 
            // 
        } 
     
        /** 
         * Store a newly created resource in storage. 
         * 
         * @param  \Illuminate\Http\Request  $request 
         * @return \Illuminate\Http\Response 
         */ 
        public function store(Request $request) 
        { 
            // 
        } 
     
        /** 
         * Display the specified resource. 
         * 
         * @param  int  $id 
         * @return \Illuminate\Http\Response 
         */ 
        public function show($id) 
        { 
            // 
        } 
     
        /** 
         * Show the form for editing the specified resource. 
         * 
         * @param  int  $id 
         * @return \Illuminate\Http\Response 
         */ 
        public function edit($id) 
        { 
            // 
        } 
     
        /** 
         * Update the specified resource in storage. 
         * 
         * @param  \Illuminate\Http\Request  $request 
         * @param  int  $id 
         * @return \Illuminate\Http\Response 
         */ 
        public function update(Request $request, $id) 
        { 
            // 
        } 
     
        /** 
         * Remove the specified resource from storage. 
         * 
         * @param  int  $id 
         * @return \Illuminate\Http\Response 
         */ 
        public function destroy($id) 
        { 
            // 
        } 
    } 

    Create Users
    Route untuk menamilkan view form tambah data users adalah users/create silahkan buka file
    UserController kemudian pada action create edit kode program menjadi seperti berikut.

    public function create() 
    {
     return view('user.create'); 
    }
    

    Perintah return view(‘user.create’) artinya menampilkan view create pada folder user,
    selanjutnya buat folder user didalam folder view, kemudian tambahkan file create.blade.php
    dan isikan dengan kode program berikut ini.

    Selanjutnya tambahkan file css dan javascript select2 kedalam layout main.blade.php

    <link href=https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css rel="stylesheet" /> 
    <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>  

    Selanjutnya membuat form inputan create user, silahkan edit user/create.blade.php menjadi seperti kode program berikut.

    @extends('layouts.main') 
    @section("judul") Create User @endsection 
    @section('konten') 
    <div class="card shadow mb-4"> 
        <div class="card-header py-3"> 
        </div> 
        <div class="card-body"> 
             
             
            <div class="row"> 
                <div class="col-lg-9"> 
     
                    <form method="POST" action="{{ route('users.store') }}"> 
                      @csrf 
                        <div class="form-group row"> 
                            <label class="col-sm-3 col-form-label text
    center">Nama</label> 
                            <div class="col-sm-9"> 
                              <input type="text" class="form-control" 
    id="nama" name="nama"> 
                            </div> 
                          </div> 
                        <div class="form-group row"> 
                          <label class="col-sm-3 col-form-label text
    center">Email</label> 
                          <div class="col-sm-9"> 
                            <input type="email" class="form-control" 
    id="email" name="email"> 
                          </div> 
                        </div> 
                        <div class="form-group row"> 
                            <label class="col-sm-3 col-form-label text
    center">Username</label> 
                            <div class="col-sm-9"> 
                              <input type="text" class="form-control" 
    id="username" name="username"> 
                            </div> 
                          </div> 
                          <div class="form-group row"> 
                            <label class="col-sm-3 col-form-label text
    center">Password</label> 
                            <div class="col-sm-2"> 
                              <input type="password" class="form-control" 
    id="password" name="password"> 
                            </div> 
                          </div> 
                          <div class="form-group row"> 
                            <label class="col-sm-3 col-form-label text
    center">Level</label> 
                            <div class="col-sm-4 mr-2"> 
                              <select  class="form-control select2-multiple" 
    name="level[]" multiple="multiple"> 
                                <option value="ADMIN">ADMIN</option> 
                                <option value="GURU">GURU</option> 
                                <option value="STAFF">STAFF</option> 
                              </select> 
                                
                            </div> 
                       
                          </div> 
    <div class="form-group row"> 
    <div class="col-sm-10 text-center"> 
    <button type="reset" class="btn btn-warning btn
    sm">Batal</button> 
    <button type="submit" class="btn btn-primary btn
    sm">Simpan</button> 
    </div> 
    </div> 
    </form> 
    </div> 
    </div> 
    </div> 
    </div> 
    @endsection 
    

    Sehingga tampilan form inputan user menjadi seperti gambar dibawah ini.

    Selanjutnya buka action store pada UserController kemudian isikan kode program berikut.

    Penjelasan :

    Form create user menggunakan method POST yang akan dikirimkan ke action store dengan route users.store, selanjutnya pada action store akan ditangkap isi form create user dengan cara $request->get(‘nama input’) kemudian disimpan pada table user dengan cara instance model User dengan cara $user = new \App\Models\User setelah itu assign sesuai dengan nama field. Untuk menyimpan kedalam database User menggunakan perintah $user->save, jika data berhasil disimpan akan di redirect ke route users.index dengan mebawa session status.

    READ / LIST USERS

    Selanjutnya setelah fungsi create selesai kita akan menampilkan data user, untuk menampilkan data user kita akan menggunakan method GET yaiitu http://localhost/users yang mana route ini merupakan action index pada UserController, buka action index kemudian edit menjadi seperti kode program berikut.

    Selanjutnya buat fille dengan nama index.blade.php pada folder views/user dan isi dengen kode program berikut.

    @extends('layouts.main') 
    @section("judul") Users @endsection 
    @section('konten') 
    @if(session('status')) 
        <div class="alert alert-success"> 
            {{session('status')}} 
        </div> 
    @endif  
    <div class="card shadow mb-4"> 
        <div class="card-header py-3"> 
        </div> 
        <div class="card-body"> 
            <div class="table-responsive"> 
            <table class="table table-bordered"  id="dataTable" width="100%" 
    cellspacing="0"> 
                <thead> 
                  <tr> 
                    <th><b>Name</b></th> 
                    <th><b>Username</b></th> 
                    <th><b>Email</b></th> 
                    <th><b>Action</b></th> 
                  </tr> 
                </thead> 
                <tbody> 
                  @foreach($users as $user) 
                    <tr> 
                      <td>{{$user->name}}</td> 
                      <td>{{$user->username}}</td> 
                      <td>{{$user->email}}</td> 
                      <td> 
                        [action] 
                      </td> 
                    </tr> 
                  @endforeach  
                </tbody> 
          
              </table> 
            </div> 
        </div> 
    </div> 
    @endsection
    

    Karena menggunakan datatables tambahkan file css datatable pada bahian head main.blade.php dan file js datatables pada bagian bawah main.blade.php.

    <link href="{{ asset('sbadmin/vendor/datatables/dataTables.bootstrap4.min.css') }}" rel="stylesheet"> 
    <script src="{{ asset('sbadmin/vendor/datatables/jquery.dataTables.min.js') }}"></script> 
    <script src="{{ asset('sbadmin/vendor/datatables/dataTables.bootstrap4.min.js') }}"></script> 
    <script src="{{ asset('sbadmin/js/demo/datatables-demo.js ') }}"></script>
    

    Selanjutnya menambahkan button untuk membuka form tambah user seperti kode program berikut ke dalam index.blade.php

    Sehingga tampilan list user menjadi seperti gambar dibawah ini.

    UPDATE USERS

    Selanjutnya untuk melakukan proses update data user terlebih dahulu kita buatkan tombol action yang mengarahkan pada route users/edit/{user}/edit atau action edit pada UserController untuk menamilkan form dan menggunakan route users/edit/{user} untuk method PUT. Pertama-tama kita akan membuat tombol edit pada tampilan list user, silahkan buka file user/index.blade.php pada kolom [action] ganti dengan kode berikut ini. Edit

    Jika salah satu tombol diatas diklik maka akan menghasilkan string url http://localhost/users/{user}/edit yang mana {user} merupakan id dari user yang di klik. Selanjutnya buka action edit pada UserController dan isikan denga kode program berikut.

    Kode diatas akan mengambil data user berdasarkan id user yang diidapatkan dan ditampung pada variable $user dan dikrimkan ke view user.edit, silahkan buat view didalam folder user/edit.blade.php dan isikan dengan kode program berikut.

    @extends('layouts.main') 
    @section("judul") Edit User @endsection 
    @section('konten') 
    <div class="card shadow mb-4"> 
        <div class="card-header py-3"> 
        </div> 
        <div class="card-body">    
            <div class="row"> 
                <div class="col-lg-9"> 
                    <form method="POST" action="{{ route('users.update', 
    [$user->id]) }}"> 
                        <input type="hidden" name="_method" value="PUT"> 
                      @csrf 
                        <div class="form-group row"> 
                            <label class="col-sm-3 col-form-label text
    center">Nama</label> 
                            <div class="col-sm-9"> 
                              <input type="text" class="form-control" 
    id="nama" name="nama" value="{{ $user->name }}"> 
                            </div> 
                          </div> 
                        <div class="form-group row"> 
                          <label class="col-sm-3 col-form-label text
    center">Email</label> 
                          <div class="col-sm-9"> 
                            <input type="email" class="form-control" 
    id="email" name="email" value="{{ $user->email }}"> 
                          </div> 
                        </div> 
                        <div class="form-group row"> 
                            <label class="col-sm-3 col-form-label text
    center">Username</label> 
                            <div class="col-sm-9"> 
                              <input type="text" class="form-control" 
    id="username" name="username" value="{{ $user->username }}" 
                              > 
                            </div> 
                          </div> 
     
                          <div class="form-group row"> 
                            <label class="col-sm-3 col-form-label text
    center">Level</label> 
                            <div class="col-sm-4 mr-2"> 
                              <select  class="form-control select2-multiple" 
    name="level[]" multiple="multiple"> 
                                <option value="ADMIN"  {{in_array("ADMIN", 
    json_decode($user->level)) ? "selected" : ""}}>ADMIN</option> 
                                <option value="GURU"  {{in_array("GURU", 
    json_decode($user->level)) ? "selected" : ""}}>GURU</option> 
                                <option value="STAFF"  {{in_array("STAFF", 
    json_decode($user->level)) ? "selected" : ""}}>STAFF</option> 
                              </select> 
                            </div> 
                          </div> 
                        <div class="form-group row"> 
                          <div class="col-sm-10 text-center"> 
                            <a href="{{ route('users.index') }}"  class="btn 
    btn-warning btn-sm">Batal</a> 
                            <button type="submit" class="btn btn-primary btn
    sm">Simpan</button> 
                          </div> 
                        </div> 
                      </form> 
                </div> 
                
            </div> 
        </div> 
    </div> 
    @endsection 
    

    Selanjutnya buka action update pada UserController kemudian isikan dengan kode program berikut ini.

    Selanjutnya kita akan mencoba melakukan perubahan data user.

    Sehingga menampilkan gambar sepertidibawah ini

    DELETE USERS

    Tambahkan tombol atau link pada list user, silahkan buka view user/index.blade.php dan tambahkan kode program berikut dibawah link edit.

    @foreach ($users as $user)
                            <tr>
                                <td>{{$user->name}}</td>
                                <td>{{$user->username}}</td>
                                <td>{{$user->email}}</td>
                                <td>
                                <a href="{{ route('users.edit', $user->id) }}" class="btn btn-sm btn-success">Edit</a>
                                <form onsubmit="return confirm('Hapus data user?')" class="d-inline" action="{{route('users.destroy', [$user->id])}}" method="POST">
                                    @csrf
                                    <input type="hidden" name="_method" value="DELETE">
                                    <input type="submit" value="Hapus" class="btn btn-danger btn-sm">
                                </form>
                                </td>
                            </tr> 
                        @endforeach
    

    Keitka diklik salah satu tombol hapus maka akan muncul pop up dialog peringatan apakah data akan dihapus seperti gambar dibawah ini.

    Jika kita tekan oke maka data akan dihapus, jika data berhasil dihapus maka akan muncul pesan seperti gambar berikut.

    MENAMBAHKAN MENU USERS

     Silahkan buka view Layouts/sidebar.blade.php kemudian tambahkan kode program berikut.

    <li class="nav-item"> 
    <a class="nav-link" href="{{ route('users.index') }}"> 
    <i class="fas fa-fw fa-users"></i> 
    <span>Users</span></a> 
    </li>
    

    Sehingga pada aplikasi akan muncul menu users seperti gambar berikut ini.

    LAPORAN PRAKTIKUM 8

    #FRAMEWORK LARAVEL – AUTH

    LANGKAH KERJA

    Aktifkan xammp terlebih dahulu, lalu Buat folder laravel-sisfo di htdocs

    1. Membuat project Laravel dengan nama Laravel-sisfo

    Ada beberapa cara yang dapat digunakan untuk membuat project baru Laravel yaitu dengan cara install installer Laravel secara globat atau install menggunakan composer.

    Comoposer

    Cara yang dapat digunakan untuk membuat project baru Laravel yaitu menggunakan comoposer, ketikkan perintah berikut pada workspace. composer create-project laravel/laravel=^12.0 laravel-sisfo –prefer-dist untuk menjalankan project dapat menggunakan perintah seperti dibawah php artisan serve.

    Klik enter dan akan menghasilkan output seperti dibawah, dan merupakan penanda bahwa berhasil.

    2. Konfigurasi Database buka file .env kemudian isikan konfigurasi datababse berikut ini.

    *pada bagian DB_CONNECTION

    3. User Authentication User authentication pada studi kasus ini menggunakan fitur authentication bawaan Laravel. Install package Laravel/ui Buka terminal/cmd kemudian ketikkan perintah berikut ini. composer require laravel/ui

    jika berhasil maka tampilannya akan seperti dibawah ini.

    Authenctiacation fitur

    Ketikkan perintah berikut pada terminal / cmd  php artisan ui bootstrap –auth, jika berhasil maka akan tampil seperti gambar berikut.

    Install dan compile 

    Ketikan perintah npm install && npm run dev untuk menginstall dan compile file-file asset bawaan, dengan perintah diatas maka file-file yang dibutuhkan untuk authentication akan di generate secara otomatis, seperti halaman login, register dan forgot password, selain itu juga akan gi generate controller auth seperti gambar berikut.

    Selain controller juga degenerate view untuk authenctication seperti gambar berikut

    Migration 

    Ketikkan perintah php artisan migrate maka Laravel akan membuat migration table authentication, jika sebelumnya belum terdapat database maka akana da konfirmasi dari larevel apakah akan dibuatkan databasenya atau tidak. Jika migaration berhasil maka akan tampil seperti tampilan berikut.

    Jika instalasi berhasil maka aplikasi sisfo sudah memiliki fitur authentication bawaan dari Laravel, berikut tampilan fitur authentication dari Laravel

    Halaman login

    Akses url http://127.0.0.1:8000/login pada browser maka akan tampil halaman login seperi berikut.

    Gambar Halaman Login Authentication

    Halaman Register Akses url http://127.0.0.1:8000/register pada browser maka akan tampil halaman register seperi berikut.

    Gambar Halaman Register Authentication

    Selanjutnya silahkan coba registrasi dan lakukan login ke aplikasi, jika berhasil maka akan tampil seperti gambar berikut.

    Gambar Halaman Dashboard

    Kesimpulan :

    Fitur authentication Laravel akan mengenerate controller, model, view dan route authentication secara otomatis, selain itu juga tampilan view sudah menggunakan framework boostrap sehingga mempermudah dalam membuat fitur authentication pada aplikasi.

    LAPORAN PRAKTIKUM 7

    #LARAVEL

    Pendahuluan

    Laravel merupakah satu framework PHP yang pupuler yang dikembangkan oleh taylor otwell,Laravel merupakan proyek open source untuk mengembangkan aplikasi berbasis web dengan arsitektur MVC (Model – View – Controller). Beberapa fitur yang tersedia pada Laravel :

    Packages: Ekosistem paket yang kaya dan berkembang pesat melalui Composer, memungkinkan Anda dengan mudah menambahkan fungsionalitas tambahan ke aplikasi Anda.

    a. Eloquent ORM (Object-Relational Mapping): Memudahkan interaksi dengan database menggunakan sintaks PHP yang intuitif. Anda dapat mendefinisikan model untuk setiap tabel database dan melakukan operasi CRUD (Create, Read, Update, Delete) dengan mudah. Eloquent juga mendukung relasi antar tabel (one-to-one, one-to-many, many-to-many)

    b. Blade Templating Engine: Sistem templating yang sederhana namun powerful, memungkinkan Anda menggunakan sintaks PHP dalam template HTML dengan cara yang bersih dan aman. Blade menyediakan direktif-direktif seperti @if, @foreach, @extends, @yield, dan komponen untuk membuat tampilan dinamis.

    c. Artisan Console: Command-line interface (CLI) yang disertakan dengan Laravel. Artisan menyediakan banyak perintah berguna untuk otomatisasi tugas-tugas umum seperti membuat model, migration, controller, seeder, menjalankan pengujian, membersihkan cache, dan banyak lagi.

    d. Routing: Sistem perutean yang fleksibel memungkinkan Anda mendefinisikan URL aplikasi Anda dan mengaitkannya dengan controller atau closure functions. Laravel mendukung berbagai jenis rute dan middleware untuk mengontrol akses.

    e. Form Request Validation: Memudahkan proses validasi data yang dikirim melalui form. Anda dapat membuat kelas Form Request khusus dengan aturan validasi yang jelas dan Laravel akan secara otomatis menangani proses validasi dan menampilkan pesan kesalahan.

    f. Security: Laravel dibangun dengan mempertimbangkan keamanan. Beberapa fitur keamanan bawaan meliputi proteksi terhadap CSRF (Cross-Site Request Forgery), XSS (Cross-Site Scripting), dan SQL injection.

    g. Authentication & Authorization: Menyediakan sistem otentikasi (login, registrasi, lupa kata sandi) dan otorisasi (hak akses pengguna) yang mudah diimplementasikan. Laravel Breeze dan Jetstream menyediakan scaffolding UI untuk fitur-fitur ini.

    h. Testing: Dukungan bawaan untuk berbagai jenis pengujian, termasuk unit testing, integration testing, dan end-to-end testing. Laravel menyediakan helper functions dan assertion methods untuk memudahkan penulisan tes.

    i. Queues: Sistem antrian yang memungkinkan Anda menunda tugas-tugas yang memakan waktu (seperti pengiriman email atau pemrosesan data) dan menjalankannya di latar belakang. Ini meningkatkan responsivitas aplikasi Anda.

    j. Caching: Mendukung berbagai sistem caching (seperti Redis, Memcached, file) untuk meningkatkan performa aplikasi dengan menyimpan data yang sering diakses dalam memori.

    k. Events & Listeners: Implementasi dari pola Observer, memungkinkan Anda membuat event dan listener untuk menjalankan kode tertentu ketika event tersebut terjadi dalam aplikasi Anda.

    l. Notifications: Memudahkan pengiriman notifikasi ke berbagai saluran, seperti email, SMS, database, atau layanan pihak ketiga. Broadcasting: Memungkinkan Anda melakukan siaran event secara real-time melalui WebSockets. Ini berguna untuk fitur seperti live chat atau notifikasi real-time.

    m. Broadcasting: Memungkinkan Anda melakukan siaran event secara real-time melalui WebSockets. Ini berguna untuk fitur seperti live chat atau notifikasi real-time.

    n. Task Scheduling: Memungkinkan Anda menjadwalkan tugas-tugas cron menggunakan sintaks yang ekspresif dalam kode PHP Anda.

    o. Passport (OAuth2 Server): Paket resmi untuk mengimplementasikan otentikasi OAuth2, memungkinkan aplikasi Anda menjadi penyedia otentikasi untuk aplikasi lain.

    p. Sanctum (API Authentication): Paket ringan untuk mengimplementasikan sistem otentikasi berbasis token untuk Single-Page Applications (SPAs), mobile applications, dan simple APIs.

    q. Socialite (Social Authentication): Memudahkan integrasi otentikasi dengan berbagai penyedia layanan OAuth seperti Facebook, Twitter, Google, dan lainnya.

    r. Filesystem: Abstraksi untuk berinteraksi dengan berbagai sistem penyimpanan file, baik lokal maupun cloud (seperti Amazon S3 atau Google Cloud Storage).

    s. Mail: Memudahkan pengiriman email dengan dukungan untuk berbagai driver seperti SMTP, Mailgun, dan Amazon SES.

    t. Pusher (Realtime Services): Integrasi mudah dengan layanan Pusher untuk menambahkan fitur realtime ke aplikasi Anda.

    u. Localization: Memudahkan pembuatan aplikasi multibahasa dengan fitur untuk mengelola terjemahan.

    Tujuan Praktikum

    Tujuan praktikum ini yaitu mampu installasi Laravel, membuat project baru Laravel, mengenal struktur Laravel, konsep MVC laravel.

    Langkah – Langkah Pengerjaan

    Install aplikasi yang dibutuhkan

    • Web server (menggunakan Apache dari XAMPP)
    • Database (menggunakan MySQL dari XAMPP)
    • Composer
    • Cmder (untuk memudahkan melakukan command di terminal)
    • Node.js dan npm
    • GIt

    Selain itu, persyaratan untuk menggunakan Laravel 12 Adalah sebagai berikut:

    • PHP >= 8.2
    • Ctype PHP Extension
    • cURL PHP Extension
    • DOM PHP Extension
    • Fileinfo PHP Extension
    • Filter PHP Extension
    • Hash PHP Extension
    • Mbstring PHP Extension
    • OpenSSL PHP Extension
    • PCRE PHP Extension
    • PDO PHP Extension
    • Session PHP Extension
    • Tokenizer PHP Extension
    • XML PHP Extension

    Pertama, install aplikasi XAMPP di https://www.apachefriends.org/index.html. Disini kita menggunakan cmd untuk mengecek berbagai hal seperti yang akan kita lakukan selanjutnya. Jika sudah terinstall, kita bisa mengecek PHP yang sudah terinstall dari XAMPP dengan command:

    Kemudian, install Composer di https://getcomposer.org/Composer-Setup.exe. Composer merupakan package manager untuk PHP, composer akan digunakan untuk menambahkan package-package yang dibutuhkan pada saat development. Install sesuai ketentuan langkah wizard setup yang diberikan. Setelah instalasi, kita bisa mengecek Composer yang telah terinstall dengan command:

    Setelah itu, install Git di https://git-scm.com/downloads/win. Install sesuai ketentuan langkah wizard setup yang diberikan. Setelah instalasi, kita bisa mengecek Git yang telah terinstall dengan command:

    Kemudian, install node.js dan npm di https://nodejs.org/. Node JS pada Laravel berfungsi untuk menangani masalah frontedn dan build asset UI (Library UI). Install sesuai ketentuan langkah wizard setup yang diberikan. Setelah instalasi, kita bisa mengecek Git yang telah terinstall dengan command:

    Setelah melakukan instalasi, kita perlu mengecek apakah spesifikasi sistem kita sesuai dengan ketentuan laravel. Gunakan file berikut untuk mengecek spesifikasi dan letakkan di folder project. Anda bisa mendownload file tersebut disini

    Pastikan setelah menjalankan file, akan berbentuk seperti berikut:

    Selanjutnya, kita akan membuat project Laravel. Ada beberapa cara untuk membuat project Laravel yaitu kita menggunakan installer atau menggunakan composer.

    LAPORAN PRAKTIKUM

    #OOP PHP & MySQL – CRUD Sederhana

    GitHub

    1. Tujuan

    Tujuan praktikum ini : mahasiswa mampu mengimplementasikan konsep Object Oriented Programming pada PHP dengan membuat aplikasi CRUD Sederhana.

    2. Konsep OOP

    a. Destructor − refers to a special type of function which will be called automatically whenever an object is deleted or goes out of scope.

    b. Class – a template for making many instances of the same kind (or class) of object.

    c. Object − individual instance of the data structure defined by a class.

    d. Member Variable − These are the variables defined inside a class. This data will be invisible to the outside of the class and can be accessed via member functions. These variables are called attribute of the object once an object is created.

    4. Member Function − These are the function defined inside a class and are used to access object data.

    e. Inheritance − When a class is defined by inheriting existing function of a parent class then it is called inheritance. Here child class will inherit all or few member functions and variables of a parent class.

    f. Parent Class − A class that is inherited from by another class. This is also called a base class or super class.

    g. Child Class − A class that inherits from another class. This is also called a subclass or derived class.

    h. Polymorphism − Same function can be used for different purposes.

    i. Overloading − a type of polymorphism in which some or all of operators have different implementations depending on the types of their arguments. Similarly functions can also be overloaded with different implementation.

    j. Data Abstraction − Any representation of data in which the implementation details are hidden (abstracted).

    k. Encapsulation − refers to a concept where we encapsulate all the data and member functions together to form an object.

    l. Constructor − refers to a special type of function which will be called automatically whenever there is an object formation from a class.

    Langkah- Langkah Pengerjaan

    1. Buat folder baru didalam folder htdocs, kemudian buka menggunakan VS Code dan buat struktur file atau direktori seperti gambar berikut ini.

    2. Koneksi ke database

    a. Pertama-tama buat database baru dengan nama pemrograman_web, kemudian buat table mahasiswa sebagai berikut.

    CREATE TABLE mahasiswa (
    id int(11) NOT NULL,
    nim varchar(16) NOT NULL,
    nama varchar(128) NOT NULL,
    jurusan varchar(128) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

    b. Selanjutnya membuat koneksi ke database, buka file config/Database.php dan ketikan kode program Berkut ini.

    <?php
    class Database {
        private $host = "localhost";
        private $db_name = "pemrograman_web";
        private $username = "root";
        private $password = "";
        public $conn;
    
        public function getConnection() {
            $this->conn = null;
            try {
                $this->conn = new mysqli($this->host, $this->username, $this->password, $this->db_name);
            } catch (Exception $e) {
                echo "Connection error: " . $e->getMessage();
            }
            return $this->conn;
        }
    }
    ?>

    c. File Config.php

    File Config.php digunakan untuk membuat variable constant yang mana nantinya dapat diakases dari kelas manapun, pada praktikum ini akan membuat variable constant dengan nama BASE_URL yang berisi string base url dari project yang akan dibuat.

    D. Alert.php

    Alert.php digunakan untuk membuat sebuah function yang berfungsi untuk menampilkan pesan Ketika melakukan operasi terhadap data, fungsi ini memiliki 2 buah argument statement yaitu $msg yang berisi pesan dan $sts yang berisi kode jika status 1 maka pesan berhasil dan jika 0 maka pesan gagal. Berikut kode program fungsi alert.

    <?php
    function alert($msg, $sts) {
        if($sts == 1) {
            $tipe = 'success';
        } else {
            $tipe = 'danger';
        }
    
        echo '
            <div class="alert alert-'.$tipe.'" role="alert">'.$msg.'
            </div>
        ';
    }

    E. Model Mahasiswa

    Class Mahasiswa digunakan untuk membuat fungsi operasi Create, Read, Update dan Delete data Mahasiswa, berikut ini Langkah-langkah pembuatan class Mahasiswa.

    1. Tambahkan session_start() pada baris paling atas kode program

    2. Buat class dengan nama Mahasiswa

    3. Deklarasikan variabel yang dibutuhkan dan fungsi constructor yang memanggil koneksi database

    <?php
    session_start();
    class Mahasiswa {
    private $conn;
    private $table_name = “mahasiswa”;

    public $id;
    public $nim;
    public $nama;
    public $jurusan;

    public function __construct($db) {
    $this->conn = $db;
    }

    4. Buat fungsi create yang nantinya digunakan untuk menambahkan data mahasiswa

        public function create() {
            $query = "INSERT INTO " . $this->table_name . " SET nim=?, nama=?, jurusan=?";
            $stmt = $this->conn->prepare($query);
            $stmt->bind_param("sss", $this->nim, $this->nama, $this->jurusan);
            if ($stmt->execute()) {
                $_SESSION['flash_message'] = "Data berhasil disimpan!";
                header("Location: " . BASE_URL . "index.php?msg=1");
            } else {
                $_SESSION['flash_message'] = "Data gagal disimpan!";
                header("Location: " . BASE_URL . "index.php?msg=0");
            }
        }

    5. Buat fungsi read untuk menampilkan data mahasiswa, fungsi read memiliki default parameter $id yang berisi string kosong, jika $id == “” maka akan mengeksekusi query untuk menampilkan seluruh data mahasiswa, jika $id !== “” maka akan mengeksekusi query untuk menampilkan data mahasiswa berdasarkan id mahasiswa. Berikut kode program fungsi read.

      public function read($id="") {
            if ($id == "") {
                $query = "SELECT * FROM " . $this->table_name;
            } else {
                $query = "SELECT * FROM " . $this->table_name . " WHERE id= " . $id;
            }
            $result = $this->conn->query($query);
            return $result;
        }

    6. Buat fungsi update untuk melakukan perubahan data mahasiswa berdasarkan ID mahasiswa

     public function update() {
            $query = "UPDATE " . $this->table_name . " SET nim=?, nama=?, jurusan=? WHERE id=?";
            $stmt = $this->conn->prepare($query);
            $stmt->bind_param("ssss", $this->nim, $this->nama, $this->jurusan, $this->id);
            if ($stmt->execute()) {
                $_SESSION['flash_message'] = "Data berhasil diupdate!";
                header("Location: " . BASE_URL . "index.php?msg=1");
            } else {
                $_SESSION['flash_message'] = "Data gagal diupdate!";
                header("Location: " . BASE_URL . "index.php?msg=0");
            }
        }

    7. Buat fungsi delete untuk menghapus data mahasiswa berdasarkan ID

        public function delete() {
            $query = "DELETE FROM " . $this->table_name . " WHERE id=?";
            $stmt = $this->conn->prepare($query);
            $stmt->bind_param("s", $this->id);
            if ($stmt->execute()) {
                $_SESSION['flash_message'] = "Data berhasil dihapus!";
                header("Location: " . BASE_URL . "index.php?msg=1");
            } else {
                $_SESSION['flash_message'] = "Data gagal disimpan!";
                header("Location: " . BASE_URL . "index.php?msg=0");
            }
        }
    }
    ?>