PART 1: Kurulum
Laravel projesini başlatmak için aşağıdaki komutları kullanın:
composer create-project laravel/laravel fruit-system
cd fruit-systemphpMyAdmin üzerinden bir veritabanı oluşturun:
fruit_db.env dosyasını şu şekilde düzenleyin:
DB_DATABASE=fruit_db
DB_USERNAME=root
DB_PASSWORD=Breeze’i yüklemek için:
composer require laravel/breeze --dev
php artisan breeze:install blade
php artisan migrate
npm install
npm run buildBootstrap UI ve sadece PDF yüklemek için:
npm uninstall tailwindcss postcss autoprefixer
composer require aldhix/breeze-bootstrap-ui
php artisan breeze-bootstrap-ui:install --force
composer require barryvdh/laravel-dompdf
npm install
npm run buildModel ve Controller oluşturun:
php artisan make:model Fruit -mcr
php artisan make:controller ReportControllerPART 2: Migration
database/migrations/xxxx_create_fruits_table.php dosyasını açın:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('fruits', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('category');
$table->decimal('price', 8, 2);
$table->integer('stock');
$table->text('description')->nullable();
$table->boolean('is_available')->default(true);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('fruits');
}
};Migration’ı çalıştırmak için:
php artisan migratePART 3: Model
app/Models/Fruit.php dosyasını açın:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Fruit extends Model
{
protected $fillable = [
'name',
'category',
'price',
'stock',
'description',
'is_available',
];
protected $casts = [
'is_available' => 'boolean',
];
}PART 4: Routes
routes/web.php dosyasını açın ve aşağıdaki kodu ekleyin:
use App\Http\Controllers\FruitController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\ReportController;
use Illuminate\Support\Facades\Route;
Route::middleware('auth')->group(function () {
Route::get("https://dev.to/", function () {
return redirect()->route('fruits.index');
});
Route::get('/dashboard', function () {
return view('dashboard');
})->name('dashboard');
Route::resource('fruits', FruitController::class);
Route::get('/reports', [ReportController::class, 'index'])->name('reports.index');
Route::get('/reports/pdf', [ReportController::class, 'exportPdf'])->name('reports.pdf');
Route::get('/reports/csv', [ReportController::class, 'exportCsv'])->name('reports.csv');
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});require DIR.’/auth.php’;
Önemli: reports.csv kullanın, reports.excel değil.
PART 5: Fruit Controller
app/Http/Controllers/FruitController.php dosyasını açın:
namespace App\Http\Controllers;
use App\Models\Fruit;
use Illuminate\Http\Request;
class FruitController extends Controller
{
public function index()
{
$fruits = Fruit::latest()->paginate(10);
return view('fruits.index', compact('fruits'));
}
public function create()
{
return view('fruits.create');
}
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'category' => 'required|string',
'price' => 'required|numeric|min:0',
'stock' => 'required|integer|min:0',
'description' => 'nullable|string',
]);
$data = $request->all();
$data['is_available'] = $request->has('is_available') ? 1 : 0;
Fruit::create($data);
return redirect()->route('fruits.index')
->with('success', 'Fruit added successfully!');
}
public function show(Fruit $fruit)
{
return view('fruits.show', compact('fruit'));
}
public function edit(Fruit $fruit)
{
return view('fruits.edit', compact('fruit'));
}
public function update(Request $request, Fruit $fruit)
{
$request->validate([
'name' => 'required|string|max:255',
'category' => 'required|string',
'price' => 'required|numeric|min:0',
'stock' => 'required|integer|min:0',
'description' => 'nullable|string',
]);
$data = $request->all();
$data['is_available'] = $request->has('is_available') ? 1 : 0;
$fruit->update($data);
return redirect()->route('fruits.index')
->with('success', 'Fruit updated successfully!');
}
public function destroy(Fruit $fruit)
{
$fruit->delete();
return redirect()->route('fruits.index')
->with('success', 'Fruit deleted successfully!');
}
}PART 6: Report Controller
app/Http/Controllers/ReportController.php dosyasını açın:
namespace App\Http\Controllers;
use App\Models\Fruit;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Http\Request;
class ReportController extends Controller
{
public function index(Request $request)
{
$query = Fruit::query();
if ($request->filled('category')) {
$query->where('category', $request->category);
}
if ($request->filled('availability')) {
$query->where('is_available', $request->availability);
}
$fruits = $query->get();
$categories = Fruit::distinct()->orderBy('category')->pluck('category');
return view('reports.index', compact('fruits', 'categories'));
}
public function exportPdf(Request $request)
{
$query = Fruit::query();
if ($request->filled('category')) {
$query->where('category', $request->category);
}
if ($request->filled('availability')) {
$query->where('is_available', $request->availability);
}
$fruits = $query->get();
return Pdf::loadView('reports.pdf', compact('fruits'))
->download('fruit-report.pdf');
}
public function exportCsv(Request $request)
{
$query = Fruit::query();
if ($request->filled('category')) {
$query->where('category', $request->category);
}
if ($request->filled('availability')) {
$query->where('is_available', $request->availability);
}
$fruits = $query->get();
$headers = [
'Content-Type' => 'text/csv',
'Content-Disposition' => 'attachment; filename="fruit-report.csv"',
];
$callback = function () use ($fruits) {
$file = fopen('php://output', 'w');
fputcsv($file, ['Name', 'Category', 'Price/kg', 'Stock', 'Available', 'Description']);
foreach ($fruits as $fruit) {
fputcsv($file, [
$fruit->name,
$fruit->category,
$fruit->price,
$fruit->stock,
$fruit->is_available ? 'Yes' : 'No',
$fruit->description ?? 'N/A',
]);
}
fclose($file);
};
return response()->stream($callback, 200, $headers);
}
}Önemli Düzenleme Düzeltmeleri:
resources/views/layouts/app.blade.php dosyasını açın ve aşağıdaki satırı bulun:
{{ $slot }} Ve bununla değiştirin:
@hasSection('content')
@yield('content')
@else
{{ $slot ?? '' }}
@endifNavigation
resources/views/layouts/navigation.blade.php dosyasını açın. Sol taraftaki navigasyon alanına şu bağlantıları ekleyin veya düzeltin:
Fruits / Index – resources/views/fruits/index.blade.php
@extends('layouts.app')
@section('content')
Fruit Products
+ Add Fruit
@if(session('success'))
{{ session('success') }}
@endif
Name
Category
Price/kg
Stock
Status
Actions
@forelse($fruits as $fruit)
{{ $fruit->name }}
{{ $fruit->category }}
₱{{ number_format($fruit->price, 2) }}
{{ $fruit->stock }} kg
@if($fruit->is_available)
Available
@else
Out of Stock
@endif
View
Edit
@empty
No fruits yet. Add one!
@endforelse
{{ $fruits->links() }}
@endsectionCreate – resources/views/fruits/create.blade.php
@extends('layouts.app')
@section('content')
Add New Fruit
@if($errors->any())
@foreach($errors->all() as $error)
{{ $error }}
@endforeach
@endif
@endsectionEdit – resources/views/fruits/edit.blade.php
@extends('layouts.app')
@section('content')
Edit - {{ $fruit->name }}
@if($errors->any())
@foreach($errors->all() as $error)
{{ $error }}
@endforeach
@endif
@endsectionShow – resources/views/fruits/show.blade.php
@extends('layouts.app')
@section('content')
{{ $fruit->name }}
Category: {{ $fruit->category }}
Price per kg: ₱{{ number_format($fruit->price, 2) }}
Stock: {{ $fruit->stock }} kg
Description: {{ $fruit->description ?? 'No description provided.' }}
Status:
@if($fruit->is_available)
Available
@else
Out of Stock
@endif
Added: {{ $fruit->created_at->format('F d, Y') }}
Edit
Back
@endsectionReports – resources/views/reports/index.blade.php
@extends('layouts.app')
@section('content')
Fruit Reports
Export PDF
Export CSV
Showing {{ $fruits->count() }} result(s)
Name
Category
Price/kg
Stock
Status
@forelse($fruits as $fruit)
{{ $fruit->name }}
{{ $fruit->category }}
₱{{ number_format($fruit->price, 2) }}
{{ $fruit->stock }} kg
@if($fruit->is_available)
Available
@else
Out of Stock
@endif
@empty
No results found.
@endforelse
@endsectionPDF Layout – resources/views/reports/pdf.blade.php
Fruit Report Fruit Sales Report
Generated: {{ now()->format('F d, Y - h:i A') }}
Name
Category
Price/kg
Stock
Status
@forelse($fruits as $fruit)
{{ $fruit->name }}
{{ $fruit->category }}
₱{{ number_format($fruit->price, 2) }}
{{ $fruit->stock }} kg
{{ $fruit->is_available ? 'Available' : 'Out of Stock' }}
@empty
No fruits found.
@endforelse
Kaynak: Orijinal Makale
- PART 1: Kurulum
- PART 2: Migration
- PART 3: Model
- PART 4: Routes
- PART 5: Fruit Controller
- PART 6: Report Controller
- Navigation
- Fruits / Index – resources/views/fruits/index.blade.php
- Fruit Products
- Create – resources/views/fruits/create.blade.php
- Add New Fruit
- Edit – resources/views/fruits/edit.blade.php
- Edit - {{ $fruit->name }}
- Show – resources/views/fruits/show.blade.php
- {{ $fruit->name }}
- Reports – resources/views/reports/index.blade.php
- Fruit Reports
- PDF Layout – resources/views/reports/pdf.blade.php


