Categories: Laravel

Laravel Başlangıç Rehberi – 9

Selam,

Bugün Laravel’e dair çeşitli özellikler ve faydalı birkaç ipucu öğreneceğim. Konularım:

  • Filtreler
  • Geçerlilik denetimi
  • Artisan dosyası ve 404
  • Generator
  • Faker

Filtreler (Filters)

Web tabanlı yazılımların en önemli parçalarından birisi kısıtlamalardır. Yapmış olduğumuz web sitemizin bazı kısımları herkesten gizlenmeli, bazı kısımları sadece yetkili kişilere açılmalı, bazı kısımları herkese açık olmalı vs… Laravel hazır olarak birkaç filtreyle beraber geliyor ve bu filtreler gerçekten temel güvenlik önlemleri için gerekli olanlardan. İhtiyaç duydukça kendi filtrelerimizi de oluşturabiliyoruz.

app dizini altında filters.php içinde bizim için hazır bekleyen filtreleri bulabiliriz. Yeni filtre eklemek istersek bu dosya üzerinde düzenleme yapabiliriz.

Bir mağazaya ait web sitesi geliştirdiğimizi ve bu web sitesinin pazar günleri ulaşıma kapalı olacağını varsayalım. Evet saçma bir durum ama bu bir örnek sadece, değil mi?

filters.php içine yeni filtremi ekliyorum:

Route::filter("pazar", function()
{
	
});

Temel yapı bu şekilde. filter() metoduna ilk olarak filtremin adını, ikinci olarak anonim bir fonksiyon gönderiyorum. Bu fonksiyonun içinde filtremin kurallarını belirtmem gerek. Yani günlerden Pazar’sa web sitesi kapalı olmalı.

Route::filter("pazar", function()
{
   if(date("l")  == "Monday")
      return "Pazar günleri kapalıyız";
   else
      return "Hoşgeldiniz";
});

Şimdi sıra bu filtreyi uygulamada. Bunun için routes.php dosyamı açıp sitemin ana urli için belirlediğim Route’u düzenleyeceğim:

Route::get('/', array("before" => "pazar", function()
{
	return View::make("home");
}

Filtreyi uygulamak için Route:get() metoduna ikinci parametre olarak bir dizi gönderiyorum. Dizinin ilk elemanı filtre, ikinci elemanı gerçekleştirmek istediğim eylemler olacak. Dizinin ilk elemanındaki "before" anahtar cümlesi route çalışmadan önce bu filtrenin kontrol edilmesi gerektiğini belirtiyor. Sonra filtremin çalışmasını istersem "after" kullanmam gerek.

Bu örnekte fonksiyon “home” view sayfamı geriye döndürüyor. Bunun yerine controller içindeki metodu da çalıştırabilirim. Bunun için dizinin ikinci elemanını “uses” anahtarı ile düzenlemem lazım.

Route::get('/', array("before" => "pazar", "uses" => "HomeController@showWelcome") );

Yukarıdaki örnekte Controller için filtremizi Route içinde ayarladık. Bunun yerine bu filtreyi Controller içinde doğrudan uygulamamız da mümkün. Route umu yeniden düzenliyorum:

Route::controller('/', "HomeController");

Şimdi de HomeController dosyamı düzenlemem gerek:

class HomeController extends BaseController {

	public function __construct()
	{
		$this->beforeFilter("pazar");
	}
	
	public function getIndex()
	{
		return "<h1> Hoşgeldiniz </h1>";
	}

	public function getHakkimizda(){
		return "<h1> Hakkımızda </h1>";
	}

	public function getIletisim(){
		return "<h1> İletişim </h1>";
	}
}

Controller içinde filtre uygulamak için __construct metodunu kullanmamız lazım. __construct() içinde beforeFilter() ile metodlar çalışmadan önce uygulanması gereken filtreyi belirtiyorum.

Yukarıdaki örnekte filtremiz controller içindeki tüm metodlara uygulanacak. İstersek bazı metodları bu filtrenin dışında tutabiliriz. Bunun için beforeFilter() metoduna ikinci parametre olarak bir dizi göndermem gerek:

public function __construct()
	{
		$this->beforeFilter("pazar", array("only" => "getHakkimizda"));
	}

Böylelikle hazırladığımız filtre sadece getHakkimizda() metodu için çalışacaktır. Daha fazla metod eklemek istersek dizi içinde göndermemiz gerek:

$this->beforeFilter("pazar", array("only" => array("getHakkimizda", "getIletisim")));

only” anahtarı ile belirttiğimiz metodlar için filtreyi çalıştırıyoruz. “except” anahtarı ile filtreden hariç tutulacak metodları belirtebiliriz:

$this->beforeFilter("pazar", array("except" => array("getHakkimizda", "getIletisim")));

Bu kod ile getHakkimizda() ve getIletisim() metodları haricindeki metodlara filtre uygulanması gerektiğini bildirdik.

Geçerlilik Denetimi (Validation)

Web projelerimiz için bir diğer önemli husus ise gönderilerin verilerin bizim için geçerli olup olmadığıdır. Örneğin, hazırladığımız üye kayıt formuna girilecek bilgiler istediğimiz tipte olmalıdır. Yani e-posta alanına kullanıcının eposta harici bir şeyler yazmasını istemeyiz.

Bu örnekten yola çıkarak basit bir form hazırlayıp, bu form üzerinde geçerlilik denetimleri gerçekleştireceğim Formumu oluşturmakla başlıyorum:

{{Form::open( array("url" => "/") )}}
        {{Form::label("isim")}}
        {{Form::text("isim")}} <br/>
        {{Form::label("website")}}
        {{Form::text("website")}} <br/>
        {{Form::label("sifre")}}
        {{Form::password("sifre")}} <br/>
        {{Form::label("sifre tekrar")}}
        {{Form::password("sifre-tekrar")}} <br/>
        {{Form::submit()}}
    {{Form::close()}}

Bu formun gönder butonuna tıklandığı zaman, sitenin anasayfasında POST eylemi çalışacak. Bunun için routes.php içinde bir post() metodu ayarlamam gerek:

Route::post("/", function(){

});

Fonksiyonun içinde formdan gelen veriler için belirli kurallar belirleyeceğim.

  • Tüm alanların doldurulması gerek,
  • Web site alanının url yapısında olması gerek,
  • Şifre  en az 8 karakter olmalı,
  • Şifre tekrar alanı şifre ile aynı değerde olmalı.

Şimdi bu kurallarımızı yazalım:

Route::post("/", function(){
	$kurallar = array(
		"isim" => "required",
		"website" => "required|url",
		"sifre" => "required|min:8",
		"sifre-tekrar" => "required|same:sifre"
	);
});

Uygulamak istediğim kuralları bir dizi içinde belirttim. Bu dizinin anahtarları formdaki alanların name değeri ile aynı olmalı. Anahtarların değerlerini ise dökümantasyonda belirtilen kurallardan alıyorum. Şimdi bu kuralları uygulamaya geçirmem lazım. Bunun için Validator sınıfından bir nesne oluşturmam gerek.

$gecerlilikKontrol = Validator::make(Input::all(), $kurallar);

Validator sınıfının make() metoduna iki parametre gönderdim. İlki formdaki verilerim, ikincisi uygulanmasını istediğim kurallarım. Validator benim için formdan gelen verilerin kurallara uyup uymadığını denetleyecek.

Formdaki veriler için belirlediğim kuralları denetlediğime göre, şimdi yapmam gereken kurallara aykırı bir durum varsa ne yapacağım? Öncelikle kullanıcıyı tekrar formu doldurması için yönlendirebilirim:

if($gecerlilikKontrol->fails()) {
		return Redirect::to("/")->withInput();
	}

Redirect::to("/") metodu kullanıcıyı sitenin ana urline geri döndürecek. withInput() metodu ile forma girilen verilerin korunmasını sağladım. withInput() metodunu kullanmazsam formdaki doldurulan alanlar sıfırlanacaktı. Böylece kullanıcı her seferinde tüm formu en baştan doldurmak zorunda kalacak ki bu pek hoş değil.

Kullanıcıyı tekrar formu düzenlemesi için geri döndürdüğüme göre hangi alanları kurallara uygun yapmadığını da bildirmem gerek. Bunun için de withErros() metodunu kullanabilirim. withErrors() metoduna parametre olarak $gecerlilikKontrol->messages() i veriyorum.

if($gecerlilikKontrol->fails()) {
		return Redirect::to("/")->withInput()->withErrors($gecerlilikKontrol->messages());
	}

Burada dikkat etmemiz gereken bir nokta daha var. Laravel hata mesajlarını İngilizce olarak sunacaktır. Eğer hata mesajlarını özelleştirmek istersek yeni bir dizi ile bunu yapabiliriz:

$mesajlar = array(
		"isim.required" => "İsim alanı gerekli",
		"website.required" => "web site alanı gerekli",
		"website.url" => "web site alanı bir url olmalı",
		"sifre.required" => "şifre alanı gerekli",
		"sifre.min" => "şifreniz min 8 karakterli olmalı",
		"sifre-tekrar.required" => 	"şifre-tekrar alanı gerekli",
		"sifre-tekrar.same" => "şife ve şifre-tekrar eşleşmiyor"
	);

Hazırladığımız bu diziyi Validator:make() metoduna dahil etmemiz gerek:

$gecerlilikKontrol = Validator::make(Input::all(), $kurallar, $mesajlar);

Şimdi geçerlilik denetiminden geçemeyen alanların mesajlarını kullanıcıya gösterelim:

@foreach($errors->all() as $error)
        {{$error}} <br/>
    @endforeach

 Artisan ve 404 Durumları

Eğitim boyunca zaman zaman komut satırından artisan ı kullanmıştım. Şu ana kadar migrate, migrate:make, db:seed vs. komutlarını kullandım  ama artisan bunlardan çok daha fazla yardımcı komuta sahip. Tüm bunların listesini php artisan list ile görebiliriz.

İşimize en çok yarayacak komutlardan biri artisan down. Bu komut ile projemizi bakım moduna alabiliriz. Varsayılan olarak bakım modunda, kullanıcılar “Be right back” mesajı ile karşılaşacaktır. Bunu özelleştirmek için app/start/global.php içindeki App:down() metodunu istediğimiz şekilde düzenleyebiliriz.

Projemizi tekrar kullanıcılara açmak için artisan up komutunu kullanabiliriz.

Ayrıca artisan dosyası içinde 404 durumlarımızı da düzenleyebiliriz. Yani web sitemizde olmayan bir url durumunda kullanıcılara vereceğimiz dönüt. Bunun için yeni App:missing() metodu oluşturup içini şu şekilde düzenliyorum:

App::missing(function($exception){
	return Response::view("404sayfasi", array(), 404);
});

Böylece artık web sitemizde olmayan urlleri ziyaret eden kullanıcılar 404sayfasi view dosyasına yönlendirilecek.

Generator

Generator, Laravel üzerinde bir takım işlemlerimizi daha pratik şekilde halletmemiz için geliştirilmiş bir paket. Kaynak kodları bu linkte.

Generator’u nasıl yükleyeceğimiz yukarıda verdiğim linkte anlatılmış. Ekstra olarak bir video anlatımda mevcut: Video

Generator yüklemek için Laravel dizinimiz içindeki composer.json dosyasını düzenlememiz gerek. “autoload” yazan kısmın hemen üstüne kodlarımı ekliyorum:

"require-dev": {
		"way/generators": "2.*"
	},

Daha sonra komut satırından composer ı çalıştırıp şu kodu yazmam gerek:

composer update --dev

Artık Generator’un yüklenmesini bekliyoruz. Bu arada halletmemiz gereken ufak bir adım kaldı. app/config/app.php dosyasında providers dizisinin sonuna şu kodu eklememiz gerek:

'Way\Generators\GeneratorsServiceProvider'

Generator dosyalarımız tamamen yüklendikten sonra komut satırından php artisan generate komutu ile pratik şekilde dosyalarımızı oluşturabiliriz.

Mesela yeni bi view dosyası oluşturmak için php artisan generate:view komutunu kullanabiliriz.

php artisan generate:view hakkimda

Böylece hakkimda.blade.php dosyası bizim için view altında oluşturulacaktır. Belli bir dizin altında oluşturmak istersek, “klasorAdi.sayfaAdi” olarak kullanabiliriz.

Generator hakkında daha fazla bilgi için buraya tekrar link bırakıyorum.

Faker

Bir önceki derste veritabanını örnek verilerle doldururken döngü kullanıp, anlamsız verilerle doldurmuştum. Eğer çalışmak istediğimiz verilerin biraz daha anlamlı olmasını istersek, mesela kullanıcı adlarının gerçekten kullanıcı adı gibi gözükmesi ya da epostaların eposta formatına uygun olması vb., Faker’ı kullanabiliriz.

Faker’ı yüklemeden önce composer için tüm paketleri bulabileceğimiz bir adres paylaşmak istiyorum: packagist

Packagistte arama alanına Faker yazarsak Faker paketimiz hakkında detaylı bilgiye ulaşabiliriz. Kaynak kodlarının depolandığı adres gibi.

Faker’ı yüklemek için composer.json dosyamızda “require” içine şu kodu eklememiz lazım: "fzaninotto/faker": "1.*"

Daha sonra komut satırımızı açıp paketimizi yükleyelim:

composer update fzaninotto/faker

Paketimiz yüklendikten sonra kullanıma hazır. Ek bir işlem yapmaya gerek yok. Faker sınıfımızı kullanmak için bir nesne oluşturup bu nesne üzerinden verilerimizi üretebiliriz:

$veri = Faker\Factory::create();
for($i = 0; $i<10; $i++){
 echo $faker->name;
}

Böylece 10 adet gerçekçi ismimiz oldu.

Faker ile üretebileceğimiz veri çeşitlerinin listesine bu linkten ulaşabilirsiniz. Türkçe veri üretmek için create() metoduna “tr_TR” parametresini göndermeniz yeterli.

 Sırada Ne Var?

Bugünkü eğitimimle birlikte Laravel, MVC ve frameworkler konusunda temel altyapıyı tamamlamış oldum ve eğtimin sonuna geldim. Takip ettiğim eğitim setinde sırada bir proje daha var: Üye Kayıt ve Giriş Sistemi. İlk projede olduğu gibi bu projeyi de bireysel olarak yapmamız önemli.

Buraya kadar öğrendiklerimizle küçük ve orta çaplı projeler geliştirmeye başlayabiliriz. Takıldığımız noktalarda Laravel’in dökümantasyonu, Laravel forumları, Laravel Türkiye IRC kanalı yardımcı olabilir.

İnternette birçok yazılı, görsel ve videolu eğitimler, örnek projeler mevcut. Bunları inceleyerek öğrendiklerimizi geliştirebiliriz. Bu eğitimde Laravel’e dair birçok şey öğrenmiş olabiliriz ama öğrendiklerimizden çok daha fazlası kenarda keşfedilmeyi bekliyor. Bunu yapmanın en iyi yolu ise bolca pratikten geçiyor.

Daha fazla uzatıp zaman kaybetmek istemiyorum. Üye kayıt ve giriş sistemi projesine hemen başlayıp tüm öğrendiklerimi uygulamaya geçirme zamanı geldi.

Herkese iyi çalışmalar…

Hatırlatma1: Laravel öğrenmek için bu linkteki eğitimi takip ediyorum ve öğrendiklerimi burada paylaşıyorum.Buraya tıklayarak eğitimin anasayfasına ulaşabilir ve kaynak kodlarını indirebilirsiniz.

Hatırlatma2: Lütfen eksik,hatalı ya da düzeltilmesi gereken bir şey farkederseniz bana bildirin.

Recent Posts

Celery Checklist [Python]

Celery ile alakalı "best practice"leri ve faydalı araçları bir araya getiren güzel bir checklist'e denk…

5 yıl ago

JavaScript Dizileri için 13 İpucu

Diziler en temel ve sık kullandığımız araçlardan... Kod yazarken işimizi kolaylaştıracak, daha temiz kod yazmamızı…

5 yıl ago

List & Tuple Mini Test (Python)

listve tuple bilginizi test etmek ister misiniz? realpython.com da keşfettiğim ve Türkçe'ye çevirdiğim mini teste…

5 yıl ago

Bilmeniz Gereken 11 Python Mülakat Sorusu

Rehberlik sağlaması ve bilgi tazelemesi açısından faydalı olduğunu düşündüğüm bir Toptal blog paylaşımınıTürkçe'ye çevirdim.Devamını okuyunBilmeniz…

5 yıl ago

Angular Componentlere Konsol Üzerinden Hızlı Erişim

Angular componentlerine console üzerinden hızlıca erişmek için kullanılan bir teknik. Unutmamak için kendime not düşüyorum.Devamını…

5 yıl ago

Birkaç Güzel JavaScript Sorusu İster Miydiniz?

Geçtiğimiz günlerde keşfettiğim ve oldukça da hoşuma giden repoyu paylaşmak istiyorum: lydiahallie/javascript-questions Genel olarak temel…

5 yıl ago