Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer

Laravel ile Ziyaretçi Defteri Yapımı

7 min read

laravel iletişim formu

Programlama öğrenmenin en pratik ve etkili yolu proje bazlı çalışmaktır. Bu nedenle de Laravel‘i öğrenmek için bir Ziyaretçi Defteri uygulaması hazırlayarak ilerleyelim. Böylelikle Laravel’in temel temel kavramlarını (artisan, migration, seeding, model, controller, view, route) uygulamalı olarak anlatmış olacağız.

Projemiz için öncelikle Laravel’i kurmamız gerekmektedir. Laravel 5 Kurulumu başlıklı yazıda bu konuya değinmiştim.

Not: Bu yazıda Laravel 5.2 sürümünü temel aldım. Daha eski veya daha yeni sürümlerde farklılıklar olabilir.

Önizleme

Laravel 5 kullanarak hazırlayacağımız Ziyaretçi Defteri’nin görünümü şu şekilde olacaktır.

Laravel 5 ile Ziyaretçi Defteri

Veritabanı Tablolarının Oluşturulması

Laravel ile veritabanı oluşturulurken Migration özelliği kullanılmaktadır. Bu nedenle biz de öncelikle veritabanımız için gerekli tablo bilgisini içeren migration dosyasını oluşturuyoruz.

[php]php artisan make:migration mesajlar_table –create=mesajlar
[/php]

Bu tablo sonucunda database/migrations klasöründe sonu mesajlar_table.php ismiyle bir dosya oluşacak. Örneği hazırlarken oluşan dosyanın tam ismi …_mesajlar_table.php şeklinde. Dosyanın içeriği ise yorum satırları arındırılmış olarak şu şekildedir.

[php]<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class MesajlarTable extends Migration { public function up() { Schema::create(‘mesajlar’, function (Blueprint $table) { $table->increments(‘id’);
$table->timestamps();
});
}
public function down()
{
Schema::drop(‘mesajlar’);
}
}[/php]

Biz bu tabloya isim, eposta ve mesaj bilgilerini gireceğimiz için aşağıdaki kodu tabloya giriyoruz.

[php]$table->string(‘isim’)->default(”);
$table->string(‘eposta’)->default(”);
$table->text(‘mesaj’)->default(”);[/php]

Böylece tablomuz şu şekilde son halini almış olacak.

[php]<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class MesajlarTable extends Migration { public function up() { Schema::create(‘mesajlar’, function (Blueprint $table) { $table->increments(‘id’);
$table->string(‘isim’)->default(”);
$table->string(‘eposta’)->default(”);
$table->text(‘mesaj’)->default(”);
$table->timestamps();
});
}
public function down()
{
Schema::drop(‘mesajlar’);
}
}[/php]

Veritabanı tablosunu oluşturmada son aşamamızda terminalde aşağıdaki kodu çalıştırarak veritabanı işlemlerini tamamlıyoruz.

[php]php artisan migrate[/php]

Veritabanına Örnek Veri Girme (Seed)

Laravel’in bir güzel özelliği de migration ile oluşturduğumuz veritabanını örnek verilerle doldurmak için Seeder kavramına sahip olmasıdır. Aşağıdaki komutu terminalde çalıştırarak Seeder dosyasını oluşturuyoruz.

[php]php artisan make:seeder MesajlarTableSeeder[/php]

Bu komut ile database/seeds klasöründe içeriği aşağıdaki gibi olan bir seeder dosyası oluşur.

[php]<?php
use Illuminate\Database\Seeder;

class MesajlarTableSeeder extends Seeder
{
public function run()
{
//
}
}[/php]

Bu dosyayı örnek verilerimizle aşağıdaki şekilde dolduruyoruz.

[php]<?php use Illuminate\Database\Seeder; class MesajlarTableSeeder extends Seeder { public function run() { DB::table(‘mesajlar’)->delete();

$girdiler = array(
[‘id’ => 1, ‘isim’ => ‘Erhan’, ‘eposta’ => ‘[email protected]’, ‘mesaj’ => ‘Bu ilk mesaj’,’created_at’ => new DateTime, ‘updated_at’ => new DateTime],
[‘id’ => 2, ‘isim’ => ‘Mehmet’, ‘eposta’ => ‘[email protected]’, ‘mesaj’ => ‘Bu ikinci mesaj’,’created_at’ => new DateTime, ‘updated_at’ => new DateTime],
[‘id’ => 3, ‘isim’ => ‘Ahmet’, ‘eposta’ => ‘[email protected]’, ‘mesaj’ => ‘Bu üçüncü mesaj’,’created_at’ => new DateTime, ‘updated_at’ => new DateTime],
);

DB::table(‘mesajlar’)->insert($girdiler);
}
}[/php]

MesajlarTableSeeder.php dosyasını düzenledikten sonra yine aynı klasördeki DatabaseSeeder.php dosyasına şu şekilde düzenliyoruz.

[php]<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { public function run() { $this->call(‘MesajlarTableSeeder’);
}
}[/php]

Veri girişi işlemini terminalden aşağıdaki komut ile tamamlıyoruz.

[php]php artisan db:seed[/php]

Gerekli Model Dosyasının Oluşturulması

Model dosyası aslında veritabanında oluşturulan tabloya ulaşım için bir araçtır. Bu nedenle genellikle sadece tablo ismi ve veri girişi yapılabilecek alanlar belirtilip dosya kapanır. Şimdi projemiz için gerekli model dosyasını terminalde aşağıdaki komut ile oluşturuyoruz.

[php]php artisan make:model[/php]

Bu komut ile app klasörü içinde Mesaj.php isimli bir dosya oluşur ve içeriği şu şekildedir.

[php]<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Mesaj extends Model
{
//
}[/php]

Laravel’de her model dosyasının esasında bir tablonun gerekli işlemlerini yapmak için oluşturduğunu bildiğimiz için bu dosyaya gerekli tablo ismini giriyoruz ve dosyamız şu şekli alıyor.

[php]<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Mesaj extends Model
{
protected $table = ‘mesajlar’;
protected $fillable = [
‘isim’,
‘eposta’,
‘mesaj’
];
}[/php]

Controller Dosyasının Oluşturulması

Controller dosyası tüm işlemlerin yapıldığı ve bence çatının temel direğini oluşturan dosyalardır ama tabi bu tartışılır, kimisi route için aynı şeyi söyler ;) Neyse, gerekli controller dosyasını terminalde aşağıdaki komut ile oluşturuyoruz. Böylece app/Http/Controllers klasöründe MesajlarController.php dosyası oluşmaktadır.

[php]php artisan make:controller MesajlarController[/php]

Yukarıdaki komutu çalıştırdıktan sonra oluşan dosyanın içeriği aşağıdaki gibidir.

[php]<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;

class MesajlarController extends Controller
{
//
}[/php]

Bu dosyamızın içinde mesajları görüntüleme, ekleme, silme ve düzenleme işlemlerini gerçekleştireceğimiz fonksiyonları ekliyoruz. Dosyanın tamamlanmış hali şu şekildedir.

[php]<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Mesaj;

class MesajlarController extends Controller {

public function index()
{
$mesajlar = Mesaj::all();
return view(‘mesajlar’, [‘mesajlar’ => $mesajlar]);
}

public function yeni(Request $request)
{
$input = $request->all();
Mesaj::create($input);
return redirect()->back();
}

public function sil($id)
{
$mesaj = Mesaj::findOrFail($id);
$mesaj->delete();
return redirect()->back();
}

public function duzenle($id)
{
$mesaj = Mesaj::findOrFail($id);
return view(‘duzenle’)->withMesaj($mesaj);
}

public function duzenlendi($id, Request $request)
{
$mesaj = Mesaj::findOrFail($id);
$input = $request->all();
$mesaj->fill($input)->save();
return redirect(‘/’);
}
}[/php]

View Dosyalarının Oluşturulması

Laravel’de sitenin görünen yüzünü oluşturan view dosyaları için Blade ismi verilen bir template sistemi kullanılmaktadır. Bu nedenle de oluşturacağımız her view dosyası dosyaismi.blade.php şeklindedir.

View dosyalarını oluşturmaya resources/views klasörü içinde temel (layout) view dosyamızı oluşturarak başlıyoruz. Bunun için de boş bir php dosyası oluşturup içerisine aşağıdaki kodları ekleyip temel.blade.php olarak kaydediyoruz.

[php]<!– Stored in resources/views/temel.blade.php –>

<html>
<head>
<title>Laravel Ziyaretçi Defteri</title>

<style>
html, body {
font-size:12px;
}
.container {
width: 360px;
border:1px solid gray;
margin: auto;
}
h2 {
text-align:center;
padding:10px;
font-size: 14px;
}
.content {
margin:10px 5px;
border-top:1px dashed #cccccc;
padding-top:5px;
}
.isim {font-weight:bold;}
.eposta {font-style:italic;}
.mesaj {color:green;}
</style>

</head>
<body>

<div class="container">
@yield(‘content’)
</div>

</body>
</html>[/php]

Temel view dosyamızdan sonra mesajları görüntüleyeceğimiz ve ayrıca yeni mesaj girme formunun bulunduğu mesajlar.blade.php dosyasını oluşturup aşağıdaki kodu içine ekliyoruz.

[php]<!– Stored in resources/views/mesajlar.blade.php –>

@extends(‘temel’)

@section(‘content’)
<h2>Mesajlar</h2>
@if ( !$mesajlar->count() )
Defterde mesaj bulunmamaktadır.
@else
@foreach( $mesajlar as $mesaj )
<div class="content">
<div class="isim">{{ $mesaj->isim }} (<a href="./sil/{{ $mesaj->id }}">Sil</a>)(<a href="./duzenle/{{ $mesaj->id }}">Düzenle</a>)</div>
<div class="eposta">{{ $mesaj->eposta }}</div>
<div class="mesaj">{{ $mesaj->mesaj }}</div>
</div>
@endforeach
@endif

<h2>Yeni Mesaj</h2>
<form method="post" action="./yeni">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<table>
<tr>
<td>Ad Soyad</td>
<td><input type="text" name="isim"></td>
<tr>
<td>E-posta</td>
<td><input type="text" name="eposta"></td>
</tr>
<tr>
<td>Mesaj</td>
<td><textarea name="mesaj"></textarea></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="gonderbuton" value="Gönder" /></td>
</tr>
</table>
</form>
@endsection[/php]

Son olarak girilen mesajı düzenleyeceğimiz formun bulunduğu duzenle.blade.php dosyasını aşağıdaki kodlarla oluşturuyoruz.

[php]<!– Stored in resources/views/duzenle.blade.php –>

@extends(‘temel’)

@section(‘content’)
<h2>Mesaj Düzenle</h2>
<form method="post" action="../duzenlendi/{{ $mesaj->id }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<table>
<tr>
<td>Ad Soyad</td>
<td><input type="text" name="isim" value="{{ $mesaj->isim }}"></td>
<tr>
<td>E-posta</td>
<td><input type="text" name="eposta" value="{{ $mesaj->eposta }}"></td>
</tr>
<tr>
<td>Mesaj</td>
<td><textarea name="mesaj">{{ $mesaj->mesaj }}</textarea></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="gonderbuton" value="Gönder" /></td>
</tr>
</table>
</form>
@endsection[/php]

Route Dosyasının Oluşturulması

Sitemizde gerekli yönlendirmelerin olacağı route dosyası app/Http klasörünün içinde routes.php dosyası ismiyle bulunmaktadır ve onun içeriğini de şu şekilde ayarlıyoruz.
[php]<?php

Route::get(‘/’, ‘MesajlarController@index’);
Route::post(‘yeni’, ‘MesajlarController@yeni’);
Route::get(‘sil/{id}’, ‘MesajlarController@sil’);
Route::get(‘duzenle/{id}’, ‘MesajlarController@duzenle’);
Route::post(‘duzenlendi/{id}’, ‘MesajlarController@duzenlendi’);[/php]

Dosyalar

Anlatmış olduğum bu ufak projemizin dosyalarını buradan indirebilirsiniz.

Son Sözler

Yazımın başında söylediğim gibi programlamada en iyi öğrenme şekli proje bazlı çalışmaktır. Ziyaretçi Defteri ile başlangıç yapalım istedim. Umarım faydalı olmuştur. Ancak şunu da söylemem gerekir, Laravale öğrenirken bazen çok sıkılacaksınız, bir çok hata mesajı alacaksını ve hatta henüz kurulum aşamasında bırakmayı düşüneceksiniz. Laravel ilk çıktığında öğrenmek için çabalarken okuduğum makalelerden birisinde “don’t give up!” diyerek bitirmişti sözü yani pes etme yani bırakma diyordu. Henüz yeni başladığım için okumaya ne demek istediğini anlamamıştım ancak zamanla çok anlamlı gelmeye başlamıştı bu söz :) Ben de size “don’t give up” diyerek sözlerimi noktalıyorum. İyi kodlamalar.

Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer