10 Tips Programmer Ketika Menggunakan Framework Laravel

Laravel adalah salah satu framework PHP yang paling populer dan banyak digunakan oleh web developer untuk membuat website yang trendi saat ini. Dengan fitur-fitur yang lengkap dan dokumentasi yang baik, Laravel memudahkan developer dalam membangun aplikasi web yang robust dan scalable.

Dalam artikel ini, kita akan membahas 10 tips penting untuk programmer ketika menggunakan framework Laravel agar pekerjaan lebih cepat dan terlihat profesional. Selain itu, kita juga akan membahas beberapa kesalahan umum yang sering dilakukan oleh programmer pemula.

Mengapa Laravel Memudahkan Pembuatan Website Tren Saat Ini

Laravel menawarkan berbagai fitur yang membuat pembuatan website menjadi lebih mudah dan cepat. Bayangkan Laravel sebagai kotak peralatan canggih yang memiliki semua alat yang Anda butuhkan untuk membangun rumah impian Anda. Dengan alat-alat ini, Anda dapat bekerja lebih cepat dan hasil akhirnya akan lebih baik. Berikut adalah beberapa fitur unggulan yang dimiliki Laravel:

1. Eloquent ORM

Eloquent ORM adalah alat yang mempermudah manipulasi database dengan model yang intuitif. Dengan Eloquent, Anda bisa berinteraksi dengan database seolah-olah Anda sedang berinteraksi dengan objek dalam bahasa pemrograman.

Analogi: Bayangkan Anda ingin membangun sebuah perpustakaan. Eloquent ORM seperti memiliki pustakawan yang dapat membantu Anda menemukan, menambah, dan mengatur buku-buku dengan cepat dan mudah, tanpa harus mencari satu per satu di rak.

Contoh Kode:

// file: app/Models/Book.php
namespace App\\\\Models;

use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory;
use Illuminate\\\\Database\\\\Eloquent\\\\Model;

class Book extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'author', 'isbn'];
}

// Mengambil semua buku dari database
$books = Book::all();

// Menambah buku baru ke database
$book = Book::create([
    'title' => 'The Great Gatsby',
    'author' => 'F. Scott Fitzgerald',
    'isbn' => '9780743273565'
]);

2. Blade Templating Engine

Blade adalah templating engine yang memudahkan pembuatan layout yang dinamis dan reusable. Dengan Blade, Anda dapat membuat tampilan yang lebih terstruktur dan mudah dikelola.

Analogi: Bayangkan Anda sedang membuat desain interior untuk beberapa ruangan. Blade seperti memiliki set cetakan untuk berbagai desain, sehingga Anda dapat dengan mudah menduplikasi dan menyesuaikan desain tersebut tanpa harus membuat dari awal setiap kali.

Contoh Kode:

<!-- file: resources/views/layouts/app.blade.php -->
<!DOCTYPE html>
<html>
<head>
    <title>@yield('title', 'Laravel App')</title>
</head>
<body>
    <div class="container">
        @yield('content')
    </div>
</body>
</html>

<!-- file: resources/views/books/index.blade.php -->
@extends('layouts.app')

@section('title', 'Book List')

@section('content')
    <h1>Book List</h1>
    <ul>
        @foreach($books as $book)
            <li>{{ $book->title }} by {{ $book->author }}</li>
        @endforeach
    </ul>
@endsection

3. Artisan Command Line Tool

Artisan adalah command line tool yang membantu dalam menjalankan berbagai perintah secara efisien, seperti migrasi database, scaffolding, dan banyak lagi.

Analogi: Bayangkan Artisan sebagai asisten pribadi yang selalu siap membantu Anda dengan berbagai tugas. Anda cukup memberikan perintah, dan Artisan akan melakukannya untuk Anda, seperti membuatkan kopi atau mengatur jadwal Anda.

Contoh Kode:

# Membuat controller
php artisan make:controller BookController

# Membuat model beserta migrasi
php artisan make:model Book -m

# Menjalankan migrasi untuk membuat tabel di database
php artisan migrate

Contoh Proyek: Membuat Aplikasi Perpustakaan Sederhana

Langkah 1: Membuat Proyek Laravel

composer create-project --prefer-dist laravel/laravel library-app
cd library-app

Langkah 2: Membuat Model dan Migrasi untuk Buku

php artisan make:model Book -m

Langkah 3: Menambahkan Schema pada Migrasi

// file: database/migrations/xxxx_xx_xx_create_books_table.php
public function up()
{
    Schema::create('books', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->string('author');
        $table->string('isbn')->unique();
        $table->timestamps();
    });
}

public function down()
{
    Schema::dropIfExists('books');
}

Langkah 4: Menjalankan Migrasi

php artisan migrate

Langkah 5: Membuat Controller untuk Buku

php artisan make:controller BookController

Langkah 6: Menambahkan Logika pada Controller

// file: app/Http/Controllers/BookController.php
namespace App\\\\Http\\\\Controllers;

use App\\\\Models\\\\Book;
use Illuminate\\\\Http\\\\Request;

class BookController extends Controller
{
    public function index()
    {
        $books = Book::all();
        return view('books.index', compact('books'));
    }

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

    public function store(Request $request)
    {
        $request->validate([
            'title' => 'required',
            'author' => 'required',
            'isbn' => 'required|unique:books',
        ]);

        Book::create($request->all());
        return redirect()->route('books.index');
    }
}

Langkah 7: Membuat View untuk Daftar Buku

<!-- file: resources/views/books/index.blade.php -->
@extends('layouts.app')

@section('title', 'Book List')

@section('content')
    <h1>Book List</h1>
    <a href="{{ route('books.create') }}">Add New Book</a>
    <ul>
        @foreach($books as $book)
            <li>{{ $book->title }} by {{ $book->author }}</li>
        @endforeach
    </ul>
@endsection

Langkah 8: Membuat View untuk Formulir Tambah Buku

<!-- file: resources/views/books/create.blade.php -->
@extends('layouts.app')

@section('title', 'Add New Book')

@section('content')
    <h1>Add New Book</h1>
    <form action="{{ route('books.store') }}" method="POST">
        @csrf
        <label for="title">Title</label>
        <input type="text" id="title" name="title">

        <label for="author">Author</label>
        <input type="text" id="author" name="author">

        <label for="isbn">ISBN</label>
        <input type="text" id="isbn" name="isbn">

        <button type="submit">Add Book</button>
    </form>
@endsection

Langkah 9: Menambahkan Route untuk Buku

// file: routes/web.php
use App\\\\Http\\\\Controllers\\\\BookController;

Route::resource('books', BookController::class);

Dengan mengikuti langkah-langkah di atas, Anda dapat membuat aplikasi perpustakaan sederhana yang memanfaatkan fitur-fitur unggulan dari Laravel. Ini menunjukkan bagaimana Laravel memudahkan pembuatan website tren saat ini dengan berbagai fitur canggih yang dimilikinya.

Contoh Tren Web Development Saat Ini

Berikut adalah beberapa tren web development terkini yang dapat dengan mudah diimplementasikan menggunakan Laravel.

Single Page Applications (SPA)

SPA adalah aplikasi web yang memuat satu halaman HTML dan secara dinamis memperbarui konten saat pengguna berinteraksi dengan aplikasi. Dengan Laravel, Anda dapat membuat backend API yang solid untuk mendukung SPA menggunakan framework front-end seperti Vue.js atau React.

Langkah-langkah untuk membuat SPA dengan Laravel:

Install Laravel:

composer create-project --prefer-dist laravel/laravel spa-backend

Buat API Controller:

php artisan make:controller UserController

// file: app/Http/Controllers/UserController.php
namespace App\\\\Http\\\\Controllers;

use App\\\\Models\\\\User;
use Illuminate\\\\Http\\\\Request;

class UserController extends Controller
{
    public function index()
    {
        return response()->json(User::all());
    }
}

Definisikan Route untuk API:

// file: routes/api.php
use App\\\\Http\\\\Controllers\\\\UserController;

Route::get('/users', [UserController::class, 'index']);

Install Vue.js (opsional):

vue create spa-frontend
cd spa-frontend
npm install axios

Contoh Penggunaan API di Vue.js:

// file: src/components/UserList.vue
<template>
  <div>
    <ul>
      <li v-for="user in users" :key="user.id">{{ user.name }}</li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      users: []
    }
  },
  mounted() {
    axios.get('<http://your-laravel-app.test/api/users>')
      .then(response => {
        this.users = response.data;
      });
  }
}
</script>

Progressive Web Apps (PWA):

PWA adalah aplikasi web yang memberikan pengalaman pengguna seperti aplikasi native, termasuk kemampuan untuk bekerja offline, notifikasi push, dan performa yang cepat. Laravel dapat digunakan bersama dengan tools seperti Laravel PWA package untuk mengimplementasikan PWA.

Langkah-langkah untuk membuat PWA dengan Laravel:

Install Laravel PWA Package:

composer require hansschouten/laravel-pwa

Konfigurasi PWA:

// file: config/laravelpwa.php
return [
    'name' => 'Laravel PWA',
    'manifest' => [
        'name' => env('APP_NAME', 'Laravel PWA'),
        'short_name' => 'PWA',
        'start_url' => '/',
        'display' => 'standalone',
        'theme_color' => '#f7f7f7',
        'background_color' => '#ffffff',
    ],
];

Publikasi Assets PWA:

php artisan vendor:publish --provider="LaravelPWA\\\\Providers\\\\LaravelPWAServiceProvider"

Testing PWA: Buka aplikasi Anda di browser dan lihat apakah aplikasi sudah memenuhi syarat PWA dengan menggunakan tool seperti Lighthouse di Google Chrome.

E-commerce Websites:

Membuat situs e-commerce dengan Laravel dapat dilakukan dengan mudah dan scalable. Laravel memiliki berbagai paket seperti Laravel Cashier untuk memudahkan manajemen pembayaran.

Langkah-langkah untuk membuat E-commerce Website dengan Laravel:

Install Laravel:

composer create-project --prefer-dist laravel/laravel ecommerce

Buat Model dan Migrasi untuk Produk:

php artisan make:model Product -m

// file: database/migrations/xxxx_xx_xx_create_products_table.php
use Illuminate\\\\Database\\\\Migrations\\\\Migration;
use Illuminate\\\\Database\\\\Schema\\\\Blueprint;
use Illuminate\\\\Support\\\\Facades\\\\Schema;

class CreateProductsTable extends Migration
{
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('description');
            $table->decimal('price', 8, 2);
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('products');
    }
}

Buat Controller untuk Produk:

php artisan make:controller ProductController

// file: app/Http/Controllers/ProductController.php
namespace App\\\\Http\\\\Controllers;

use App\\\\Models\\\\Product;
use Illuminate\\\\Http\\\\Request;

class ProductController extends Controller
{
    public function store(Request $request)
    {
        $product = new Product();
        $product->name = $request->name;
        $product->description = $request->description;
        $product->price = $request->price;
        $product->save();

        return response()->json(['message' => 'Product created successfully']);
    }
}

Definisikan Route untuk Produk:

// file: routes/web.php
use App\\\\Http\\\\Controllers\\\\ProductController;

Route::post('/products', [ProductController::class, 'store']);

Install Laravel Cashier untuk Manajemen Pembayaran (opsional):

composer require laravel/cashier

// file: config/services.php
'stripe' => [
    'model' => App\\\\Models\\\\User::class,
    'key' => env('STRIPE_KEY'),
    'secret' => env('STRIPE_SECRET'),
],

// file: .env
STRIPE_KEY=your-stripe-key
STRIPE_SECRET=your-stripe-secret

Pentingnya Membaca Dokumentasi Laravel

Banyak programmer pemula sering mengabaikan dokumentasi resmi Laravel, padahal dokumentasi tersebut sangat lengkap dan membantu. Membaca dokumentasi dapat menghemat waktu dan mencegah kesalahan yang tidak perlu.

Belajar Laravel dengan Project-Based Learning

Untuk mempercepat pembelajaran Laravel, belajar sekaligus membangun proyek nyata adalah metode yang sangat efektif. Salah satu platform yang menyediakan kelas dengan konsep ini adalah buildwithangga.com. Dengan project-based learning, Anda bisa langsung mengaplikasikan teori yang dipelajari ke dalam proyek nyata.

10 Tips Programmer Menggunakan Framework Laravel

Untuk menjadi lebih efisien dan profesional dalam menggunakan Laravel, berikut adalah 10 tips yang dilengkapi dengan contoh kode dalam proyek yang lebih kompleks.

1. Gunakan Artisan CLI

Artisan CLI dapat membantu mempercepat banyak tugas seperti membuat controller, model, dan migrasi. Selain itu, Anda dapat membuat perintah khusus untuk kebutuhan proyek Anda.

Contoh Kode:

# Membuat controller
php artisan make:controller UserController

# Membuat model beserta migrasi
php artisan make:model Product -m

# Membuat seeder
php artisan make:seeder ProductSeeder

# Membuat perintah kustom
php artisan make:command GenerateReport

Penggunaan dalam proyek:

// file: app/Http/Controllers/UserController.php
namespace App\\\\Http\\\\Controllers;

use App\\\\Models\\\\User;
use Illuminate\\\\Http\\\\Request;

class UserController extends Controller
{
    public function index()
    {
        $users = User::all();
        return view('users.index', compact('users'));
    }
}

// file: app/Console/Commands/GenerateReport.php
namespace App\\\\Console\\\\Commands;

use Illuminate\\\\Console\\\\Command;

class GenerateReport extends Command
{
    protected $signature = 'report:generate {type}';
    protected $description = 'Generate a report based on the given type';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $type = $this->argument('type');
        $this->info("Generating {$type} report...");
        // Logic untuk generate report
    }
}

2. Manfaatkan Eloquent ORM

Eloquent membuat manipulasi database menjadi lebih intuitif dan mudah, terutama dalam proyek yang kompleks dengan banyak relasi antar tabel.

Contoh Kode:

// file: app/Models/Product.php
namespace App\\\\Models;

use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory;
use Illuminate\\\\Database\\\\Eloquent\\\\Model;

class Product extends Model
{
    use HasFactory;

    protected $fillable = ['name', 'description', 'price'];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }
}

// Mengambil semua produk dengan kategori dan tag
$products = Product::with(['category', 'tags'])->get();

3. Pahami Blade Templating

Blade membuat pembuatan tampilan menjadi lebih sederhana dan terorganisir, terutama ketika bekerja dengan banyak komponen dan layout yang kompleks.

Contoh Kode:

<!-- file: resources/views/layouts/app.blade.php -->
<!DOCTYPE html>
<html>
<head>
    <title>@yield('title', 'Laravel App')</title>
</head>
<body>
    <div class="container">
        @yield('content')
    </div>
</body>
</html>

<!-- file: resources/views/products/index.blade.php -->
@extends('layouts.app')

@section('title', 'Product List')

@section('content')
    <h1>Product List</h1>
    <ul>
        @foreach($products as $product)
            <li>{{ $product->name }} - {{ $product->price }}</li>
        @endforeach
    </ul>
@endsection

4. Gunakan Middleware untuk Keamanan

Middleware sangat berguna untuk menangani otentikasi dan otorisasi. Ini dapat digunakan untuk memfilter permintaan HTTP dan memastikan keamanan aplikasi Anda.

Contoh Kode:

// file: app/Http/Middleware/CheckAdmin.php
namespace App\\\\Http\\\\Middleware;

use Closure;
use Illuminate\\\\Support\\\\Facades\\\\Auth;

class CheckAdmin
{
    public function handle($request, Closure $next)
    {
        if (!Auth::user() || !Auth::user()->is_admin) {
            return redirect('/home');
        }
        return $next($request);
    }
}

// Register middleware di kernel
// file: app/Http/Kernel.php
protected $routeMiddleware = [
    // Middleware lainnya
    'admin' => \\\\App\\\\Http\\\\Middleware\\\\CheckAdmin::class,
];

// Menggunakan middleware di route
// file: routes/web.php
Route::middleware(['admin'])->group(function () {
    Route::get('/admin/dashboard', [AdminController::class, 'index']);
});

5. Manfaatkan Laracasts

Laracasts menyediakan tutorial video yang sangat membantu untuk memahami Laravel secara mendalam. Banyak developer profesional memanfaatkan sumber daya ini untuk meningkatkan skill mereka.

6. Gunakan Tinker untuk Debugging

Tinker memungkinkan Anda untuk berinteraksi dengan aplikasi Laravel melalui command line, yang sangat berguna untuk debugging dan pengujian.

Contoh Kode:

php artisan tinker

>>> $user = User::find(1);
>>> $user->name = 'New Name';
>>> $user->save();

7. Implementasikan Caching

Memanfaatkan caching dapat mempercepat aplikasi Anda dengan menyimpan data yang sering diakses dalam cache.

Contoh Kode:

// Menyimpan data dalam cache
Cache::put('key', 'value', $minutes);

// Mengambil data dari cache
$value = Cache::get('key');

// Menggunakan cache di controller
// file: app/Http/Controllers/ProductController.php
public function index()
{
    $products = Cache::remember('products', 60, function() {
        return Product::all();
    });

    return view('products.index', compact('products'));
}

8. Gunakan Laravel Horizon untuk Queues

Horizon memudahkan manajemen antrian pekerjaan, yang sangat berguna dalam aplikasi skala besar yang membutuhkan pemrosesan tugas asinkron.

Contoh Kode:

composer require laravel/horizon
php artisan horizon:install
php artisan migrate

// file: config/horizon.php
'environments' => [
    'production' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['default'],
            'balance' => 'simple',
            'processes' => 10,
            'tries' => 3,
        ],
    ],
],

# Menjalankan Horizon
php artisan horizon

9. Manfaatkan Paket Eksternal

Laravel memiliki ekosistem paket yang kaya untuk mempercepat pengembangan. Anda bisa memanfaatkan berbagai paket eksternal untuk menambahkan fitur ke aplikasi Anda.

Contoh Kode:

composer require barryvdh/laravel-dompdf

// file: app/Http/Controllers/InvoiceController.php
namespace App\\\\Http\\\\Controllers;

use Barryvdh\\\\DomPDF\\\\Facade as PDF;

class InvoiceController extends Controller
{
    public function generatePDF()
    {
        $data = ['title' => 'Welcome to Laravel PDF'];
        $pdf = PDF::loadView('invoice', $data);
        return $pdf->download('invoice.pdf');
    }
}

10. Gunakan Testing

Laravel memudahkan penulisan tes untuk memastikan aplikasi berjalan dengan baik. Penulisan tes sangat penting untuk memastikan bahwa fitur-fitur dalam aplikasi Anda berfungsi sebagaimana mestinya.

Contoh Kode:

// file: tests/Feature/UserTest.php
namespace Tests\\\\Feature;

use Tests\\\\TestCase;
use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase;

class UserTest extends TestCase
{
    use RefreshDatabase;

    public function test_example()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }

    public function test_create_user()
    {
        $response = $this->post('/users', [
            'name' => 'John Doe',
            'email' => '[email protected]',
            'password' => 'password',
        ]);

        $response->assertStatus(201);
        $this->assertDatabaseHas('users', ['email' => '[email protected]']);
    }
}

Dengan menerapkan tips-tips di atas, Anda dapat meningkatkan efisiensi dan profesionalisme dalam pengembangan aplikasi menggunakan Laravel. Selalu perbarui pengetahuan Anda dan manfaatkan sumber daya yang ada untuk mengoptimalkan kerja Anda.

Kesalahan Umum Programmer Ketika Menggunakan Framework Laravel

Ketika menggunakan framework Laravel, ada beberapa kesalahan umum yang sering dilakukan oleh programmer, terutama pemula. Memahami kesalahan-kesalahan ini dapat membantu Anda menghindarinya dan meningkatkan kualitas kode serta keamanan aplikasi Anda.

1. Tidak Membaca Dokumentasi

Banyak programmer pemula sering mengabaikan dokumentasi resmi Laravel. Padahal, dokumentasi Laravel sangat lengkap dan informatif. Dokumentasi ini mencakup berbagai aspek dari framework, mulai dari pengenalan dasar hingga fitur-fitur lanjutan.

Contoh Kesalahan:

  • Menggunakan fitur tanpa memahami cara kerjanya.
  • Salah konfigurasi yang menyebabkan error.

Solusi:

  • Luangkan waktu untuk membaca dan memahami dokumentasi Laravel.
  • Gunakan dokumentasi sebagai referensi utama ketika menghadapi masalah.

Contoh Kode:

// Kesalahan: Menggunakan query builder tanpa memahami cara kerjanya.
$users = DB::table('users')->get();

2. Mengabaikan Keamanan

Keamanan adalah aspek penting dalam pengembangan aplikasi web. Namun, banyak programmer sering mengabaikan middleware dan validasi data, yang dapat menyebabkan celah keamanan dalam aplikasi mereka.

Contoh Kesalahan:

  • Tidak menggunakan middleware untuk otentikasi.
  • Tidak memvalidasi input dari pengguna.

Solusi:

  • Selalu gunakan middleware untuk melindungi rute yang membutuhkan otentikasi.
  • Validasi semua input dari pengguna untuk mencegah serangan seperti SQL Injection.

Contoh Kode:

// Kesalahan: Tidak menggunakan middleware untuk otentikasi.
Route::get('/dashboard', [DashboardController::class, 'index']);

// Solusi: Gunakan middleware untuk melindungi rute.
Route::middleware(['auth'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
});

// Kesalahan: Tidak memvalidasi input dari pengguna.
public function store(Request $request)
{
    $user = new User();
    $user->name = $request->name;
    $user->email = $request->email;
    $user->save();
}

// Solusi: Validasi input dari pengguna.
public function store(Request $request)
{
    $validatedData = $request->validate([
        'name' => 'required|max:255',
        'email' => 'required|email|unique:users',
    ]);

    $user = new User();
    $user->name = $validatedData['name'];
    $user->email = $validatedData['email'];
    $user->save();
}

3. Tidak Menggunakan Versi Terkini

Laravel secara rutin merilis pembaruan yang mencakup fitur-fitur baru, peningkatan performa, dan perbaikan keamanan. Menggunakan versi Laravel yang sudah lama dapat menyebabkan masalah kompatibilitas dan celah keamanan yang tidak teratasi.

Contoh Kesalahan:

  • Menggunakan Laravel versi lama yang tidak didukung lagi.
  • Tidak memanfaatkan fitur-fitur terbaru yang disediakan Laravel.

Solusi:

  • Selalu periksa dan gunakan versi terbaru dari Laravel.
  • Baca changelog untuk mengetahui fitur-fitur baru dan perbaikan yang ada.

Contoh Kode:

# Kesalahan: Menggunakan Laravel versi lama.
composer create-project --prefer-dist laravel/laravel:^7.0 myproject

# Solusi: Menggunakan versi terbaru Laravel.
composer create-project --prefer-dist laravel/laravel myproject

Dengan memahami dan menghindari kesalahan-kesalahan umum ini, Anda dapat mengembangkan aplikasi Laravel yang lebih aman, efisien, dan up-to-date. Pastikan untuk selalu membaca dokumentasi, menjaga keamanan aplikasi, dan menggunakan versi terbaru dari Laravel untuk hasil terbaik.

Penutup dan Saran

Laravel adalah pilihan yang tepat untuk membangun aplikasi web yang modern dan scalable. Dengan berbagai fitur dan komunitas yang besar, Anda bisa belajar banyak dan mendapatkan dukungan yang diperlukan. Untuk belajar Laravel dengan efektif, sebaiknya Anda membaca dokumentasi, mengikuti tutorial video di Laracasts, dan belajar melalui project-based learning seperti yang disediakan oleh buildwithangga.com. Dengan demikian, Anda akan lebih cepat menguasai Laravel dan dapat membangun aplikasi web yang profesional.

Semoga artikel ini bermanfaat dan selamat coding!