Laravel Life Cycle
ROUTES:Gelen istekleri karşılar ve controller’a gönderir.
MODELS : Veritabanını sorgular ve gerekli verileri döndürür.
VIEWS : Template Engine ile render edilmiş görünüm sayfalarıdır.
CONTROLLERS : Kullanıcı isteklerini idare eder, modellerden veri alır ve görünümlere iletir.
3.
Laravel Root /App
Öncelikle /app dizinine bir göz atalım.
Uygulamamızın ana dizini /app klasörüdür.
Uygulama geliştirirken, neredeyse vaktimizin tamamını
bu klasör altında geçireceğiz.
Console
Tüm artisan komutlarını içerir.
Http
Tüm denetçilerinizi (Controllers), ara katmanlarınızı
(Middlewares), gelen isteklerinizi (Requests) ve
rotalarınızı içerir.
Providers :
Tüm uygulama servis sağlayıcılarını içerir. Laravel’in
çekirdek hizmetlerinin tamamı servis sağlayıcılar
tarafından önyüklenebilir.
4.
Laravel Root /App
Events
Tüm etkinlik sınıflarını içerir.
Listeners
Etkinlik sınıflarını dinleyen listener sınıflarını içerir.
Exceptions
Uygulamaki özel durum hatalarını yakalayan sınıfları
içerir.
Jobs
Uygulamanız tarafından sıraya alınan tüm işleri içerir.
Policies
Uygulamanız için yetkilendirme sınıflarını içerir. Bir
kullanıcının bir işlemi gerçekleştirebileceklerini belirlemek
için kullanılır.
Not: Klasör içerisindeki user.php bir model dosyasıdır.
Laravel dizin yapısında model klasörü bulunmamaktadır.
Model sınıfları /app dizininin altında oluşturulmaktadır.
5.
Laravel Root /Other
bootstap
Uygulamanın autoloading ve önbellek dosyalarını içerir.
config
Uygulamanın ayar dosyalarını içerir.
6.
Laravel Root /Other
database
Veritabanı Seeder ve Migration dosyalarını içerir.
Örnek Migration
7.
Laravel Root /Other
public
Resimler, CSS, Javascript dosyalarını içerir.
resources
Görünüm (views) ve dil dosyalarını içerir.
8.
Laravel Root /Other
Storage
Tüm compile edilmiş blade şablonlarını, cache
dosyalarını ve log kayıtlarını içerir.
tests
Test sınıflarını içerir.
vendor
Uygulamadaki paket bağımlılıklarını içerir.
9.
Application Example
Örnek birveri listeleme işlemi yapalım.
Uygulamayı ilk kez indiriyorsanız aşağıdaki adımları takip ediniz.
1. git clone https://github.com/laravel/laravel.git
2. cd laravel
3. cp .env.example .env
4. composer install
5. php artisan key:generate
Application Example
Terminal’I açıpuygulama dizinine geliyoruz. Artisan komutuyla yeni bir controller
oluşturuyoruz.
php artisan make:controller ExampleController
IDE ile projemizi açıp /app/Http/Controller
dizininde ExampleController.php dosyasını
göreceksiniz.
Hemen düzenlemeye başlıyoruz.
Sınıf içerisine index adından yeni bir
fonksiyon tanımlayalım.
13.
Application Example
Peki bununçıktısını nasıl göreceğiz ?
Bunun için hemen /routes/web.php dosyasını açıp rotamızı ilgili sınıfın fonksiyonuna
bağlıyoruz.
Gelen URL parametresi ile sınıf içerisindeki fonksiyonu bağlıyoruz.
14.
Application Example
Browser’a geliphemen kontrol edelim.
Gördüğünüz gibi rotamızı ExampleController’ın index fonksiyonuna başarıyla
Bağlamış olduk.
15.
Application Example
Route’da aşağıdakigibi bir fonksiyonda kullanılabilir ama bu tavsiye edilen bir yöntem
değildir.
GET yöntemiyle bir istek yapmış olduk. Mevcut yönlendirici yöntemlerini de sıralayalım.
16.
Application Example
Bazen birdençok HTTP fiiline yanıt veren bir yönlendirme kayıt etmeniz gerekebilir.
Bunu match yöntemi kullanarak yapabilirsiniz.
Route Parametreleri
URL içerisindeki ID’yi yakalamak için yönlendirme parametreleri tanımlayabilirsiniz.
17.
Application Example
Örneklere devamediyoruz. DuyuruController içerisinde liste oluşturup bunu view
dosyasına göndereceğiz.
• Rotamızı belirleyelim.
Route::get('/duyurular', 'DuyuruController@liste');
• Terminal üzerinden Controller’ı oluşturalım.
Php artisan make:controller DuyuruController
• resources/views/ klasörü içerisinde duyurular.blade.php adında bir dosya
oluşturalım.
18.
Application Example
DuyuruController içerisindeaşağıdaki fonksiyonu yazalım.
Peki ne yaptık ?
$duyurular adında bir dizi oluşturduk. duyurular.blade.php adında ki view dosyasına with ile
duyurular değişkenini with ile gönderdik. Laravel, Blade Template Engine’i kullanır ve compile
edilebilmesi için view dosyalarının sonuna .blade eklenmelidir.
Örneğin; dosyaadi.blade.php ( View’i return ederken yanlızca dosya adı yazılır.
Dosya, view dizini içerisinde bir alt klasör içerisinde olduğunda klasoradi.dosyaadi seklinde
yazıyoruz.
19.
Application Example
Şimdi duyurular.blade.phpdosyamızı açıp gönderilen değişkeni listeleyelim.
Bu bölümde Blade’I anlamaya
çalışacağız.
Blade içerisinde <?php ?> tagları
kullanılabilir fakat tercih edilen bir
yöntem değildir.
Döngüler
@foreach($cogul as tekil)
@endforeach
Tag
<?php tagları yerine çift süslü parantez
kullanılır.
{{ $var }}
Application Example
BLADE TEMPLATEENGINE
Blade, Laravel ile gelen pratik, ancak güçlü şablonlama motorudur. Diğer popüler PHP şablonlu motorların
aksine, Blade, view dosyalarında düz PHP kodunu kullanmanızı kısıtlamaz. Aslında, tüm Blade görüntüleri
düz PHP kodu halinde derlenir ve değiştirilene kadar önbelleğe alınır, yani Blade uygulamanıza sıfır yük
ekler. Blade görünümü dosyaları .blade.php dosya uzantısını kullanır ve genellikle resources / views
dizininde saklanır.
Layout Kullanımı
İlk olarak, bir ”master" sayfa düzenini inceleyeceğiz. Çoğu web uygulaması çeşitli genel sayfalarda
aynı genel düzenini koruduğu için, bu düzeni tek bir blade görünümü olarak
tanımlamak daha uygundur:
Application Example
BLADE TEMPLATEENGINE
Bazen bir değişkeni yazdırmak isterken değişkenin tanımlanmış olduğundan emin olamadığımız
durumlarda shorthand if/else yapısını kullanırız.
Bunun yerine blade ile aşağıdaki kısayolu kullanabiliriz. Blade bunu üçlü ifade gibi derleyecektir.
Varsayılan olarak, XSS saldırılarını önlemek için Blade {{}} ifadeleri otomatik olarak PHP'nin
htmlentities işleviyle gönderilir. Verilerinizin çıkmasını istemiyorsanız aşağıdaki sözdizimini
kullanabilirsiniz:
24.
Application Example
BLADE TEMPLATEENGINE
IF/ELSE
If ifadelerini @if, @elseif, @else ve @endif yönergelerini kullanarak oluşturabilirsiniz. Bu yönergeler PHP
eşdeğerleriyle aynı işlevi görür:
25.
Application Example
BLADE TEMPLATEENGINE
IF/ELSE
If ifadelerini @if, @elseif, @else ve @endif yönergelerini kullanarak oluşturabilirsiniz. Bu yönergeler PHP
eşdeğerleriyle aynı işlevi görür:
UNLESS
Kolaylık sağlamak için, Blade ayrıca bir @unless
yönergesi sağlar. (Sonuç false ise)
26.
Application Example
BLADE TEMPLATEENGINE
LOOP
Koşullu ifadelere ek olarak, Blade PHP'nin döngü yapılarıyla çalışmak için basit yönergeler sağlar. Yine, bu
yönergelerin her biri PHP eşdeğerleriyle aynı işlev görür:
27.
Application Example
BLADE TEMPLATEENGINE
Döngüler
Döngüler kullanırken, döngüyü de sonlandırabilir veya geçerli yinelemeyi atlayabilirsiniz:
Koşulu tek bir satırda da belirtebilirsiniz.
28.
Application Example
BLADE TEMPLATEENGINE
Loop Değişkeni
Döngü yaparken, döngü içinde $loop değişkeni bulunur. Bu değişken, geçerli döngü dizini ve bunun döngü
aracılığıyla ilk veya son yineleme olup olmadığı gibi yararlı bazı bilgilere erişilmesini sağlar:
İç içe geçmiş bir döngüyseniz, parent özelliğinden
döngünün $ loop değişkenine erişebilirsiniz:
29.
Application Example
BLADE TEMPLATEENGINE
Loop Property
$ loop değişkeni ayrıca çeşitli özellikleri de içerir:
Geçerli döngü yinelemesi dizini (0'dan başlar).
Geçerli döngü yinelemesi dizini (1’den başlar).
Döngü döngede kalır.
Döngüdeki öğeleri toplar.
Döngünün ilk öğesi
Döngünün son öğesi
Geçerli döngü derinliği
Geçerli döngünün bir üst öğesi
Comment Satırı
PHP Tag
30.
Application Example
BLADE TEMPLATEENGINE
Include
Blade'in @include yönergesi, Blade görünümünü başka bir görünüme dahil etmenizi sağlar. Üst görünümde
kullanılabilen tüm değişkenler, birlikte gelen görünüme de aktarılacaktır.
Dahil edilen görünüm, üst görünümde mevcut tüm verileri devralacak
olsa da, ek bir dizi veriyi dahil edilen görünüme de aktarabilirsiniz:
Olabileceği veya olmayabileceği bir görünümü eklemek isterseniz
@includeIf yönergesini kullanmalısınız:
Blade ile ilgili daha detaylı bilgi için;
https://laravel.com/docs/5.3/blade
31.
Application Example
Şimdi örnekuygulamamıza devam edelim. Öncelikle mysql veritabımızı uygulamaya tanıtalım. Daha sonra blog
adında bir tablo oluşturup kayıt oluşturup listeleyelim.
1. Öncelikle uygulamanın rootunda yer alan .env dosyamızı açıyoruz. Mysql bilgilerimizi yazıp kaydediyoruz.
32.
Application Example
• Tablooluşturabilmek uygulama içerisinde terminali çalıştırıp aşağıdaki komutu yazıyoruz
php artisan make:migration blogs_tablosunu_olustur --create=blogs
Bu komut ile birlikte yeni bir migration sınıfı oluşturduk. Veritabanı şemasını oluşturacağız.
33.
Application Example
Migrasyon sınıfıbağlı fonksiyonlarıyla birlikte oluşturuldu.
Şimdi tek yapmamız gereken istediğimiz alanları eklemek!
Öncelikle döküman üzerinden veritiplerini inceleyelim.
Tüm liste için tıklayın;
https://laravel.com/docs/5.3/migrations
34.
Application Example
Alanlarımızı belirlediğimizive döküman üzerinden veri tiplerine göre şemaya eklediğimizi varsayıyorum.
Çıktı aşağıdaki gibi olacaktır;
Eklediğimiz alanlar; title, description, content, active
35.
Application Example
Alanları eklediktensonra tekrar terminal’e gelip aşağıdaki komutu çalıştırıyoruz.
php artisan migrate
İşlem bu kadar basit artık veritabanımızda belirlediğimiz alanlar ve veri tipleriyle birlikte blogs tablomuz oluşturuldu.
36.
Application Example
Blog içintablomuzu migrate ettik. Şimdi modelimizi oluşturacağız. Terminal üzerinden aşağıdaki komutu yazalım.
php artisan make:model Blog
Laravel’de genellikle model isimleri tekil, tablo isimleri ise çoğuldur.
Örneğin; Tablo adı “articles”, model adı Article şeklinde.
Şimdi /app dizinimizin altına bakalım ve model sınıfımızın oluşup / oluşmadığını kontrol edelim.
37.
Application Example
Eğer belirttiğimizgibi model adı tekil, tablo adı çoğul değil ise sınıf içerisinde tablo adını belirtmek zorundayız.
Varsayılan olarak Laravel model adına s takısı ekleyip veritabanı içerisinde o tabloyu arar ve modele eşler.
Dikkat ettiyseniz model sınıfı Eloquent ORM ‘den extend ediliyor. Peki nedir bu Eloquent ORM ?
Laravel ile birlikte gelen Eloquent ORM, veritabanınızla çalışmak için güzel, basit bir ActiveRecord uygulaması sağlar. Her
bir veritabanı tablosu, bu tabloyla etkileşimde bulunmak için kullanılan bir "Model" e sahiptir. Modeller tablolardaki verileri
sorgulamanın yanı sıra tabloda yeni kayıtlar eklemenize izin verir.
38.
Application Example
Eloquent ORM’dedilediğiniz veritabanını, sorgularınızı hiç değiştirmeden kullanabilirsiniz.
Varsayılan veritabanını ve bilgileri yapılandırmak için /config/database.php dosyasını inceleyebilirsiniz.
39.
Application Example
• Şimdiörnek uygulamıza geri dönelim ve BlogController’ı oluşturalım.
php artisan make:controller BlogController --resource
40.
Application Example
• Rotalarımızıoluşturalım. (routes/web.php)
Eğer dikkat ettiyseniz Route::get, Route::post şeklinde bir kullanım yerine Route::resource şeklinde kullandık.
Şimdi terminal’e gelelim ve aşağıdaki komutu yazalım.
php artisan route:list
Gördüğünüz gibi resource kullandığımız için yönlendirici yöntemlerini uygulama rotalara dahil etti.
BlogController oluştururken de –resource ekini kullanmıştık ve bu metotların tümü sınıfımıza eklenmişti.
41.
Application Example
• Şimdiisterseniz Browser’ı açıp URI’leri test edelim.
http://localhost:8000/blog URI’sinin Action’ı;
AppHttpControllersBlogController@index
Fonksiyon boş olduğu için beyaz bir sayfa ile
karşılaştık.
42.
Application Example
• Şimdihemen resources/views dizini altına blade dosyalarımızı oluşturalım.
Master Page Layout’u oluşturalım.
(resources/views/layouts/master.blade.php)
43.
Application Example
• Createview’i (Yeni Blog Ekleme Sayfası) oluşturalım. (resources/views/blog/create.blade.php)
44.
Application Example
• Rotayı,view’e bağlayalım.
( BlogController’da create fonksiyonu çalıştığında blog/create.blade.php’yi return eder. )
45.
Application Example
• Rotayı,view’e bağlayalım.
( BlogController’da create fonksiyonu çalıştığında blog/create.blade.php’yi
return eder. )
Form submit edildiğinde store fonksiyonu
çalışacak.
Bu fonksiyonun içerisine de gelen request’i
return ediyoruz.
46.
Application Example
• Form’dengelen request’i JSON formatında return ettik.
Peki formdan gelen request’i veritabanına nasıl kaydedeceğiz ? Oldukça kolay!
47.
Application Example
• Formutekrar submit ediyoruz.
Formumuz blogs tablosuna kaydedildi. Sizce de oldukça kolay olmadı mı ?
48.
Application Example
• Şimdibloglarımızı listeleyelim. Hemen ilgili alanları düzenliyoruz.
BlogController@index fonksiyonu içerisinde;
resources/views/blog/index.php içerisinde;
49.
Application Example
• Hemenbrowser’a tekrar gelip http://localhost:8000/blog yazalım ve kontrol edelim.
Şimdi bu listeye bir de düzenle ikonu ekleyelim ve bu içerikleri nasıl düzenleyebiliyoruz görelim....
Font Awesome’u CDN’den çekelim.
Application Example
• Formsubmit edildiğinde BlogController@update fonksiyonu çalışır. Burada da request’i alıp model’e kaydediyoruz.
54.
Application Example
• Güncellemetamamlandığında listeye tekrar geri gönderiyoruz.
Şimdi bir de liste üzerinde başlığa tıklayarak blog detay sayfasını hazırlayalım.
Bunun için BlogController@show methodunu kullanacağınız. İlk önce listedeki başlıkları linklendirelim.
Application Example
• BlogController@showfonksiyonunu düzenliyoruz;
• Birde resources/blog içerisinde show.blade.php dosyasını oluşturup düzenliyoruz. Bunu daha önce oluşturmamıştık.
Application Example
• Silmeiçin de BlogController@destroy fonksiyonunu kullanacağız. Onu da aşağıdaki şekilde düzenliyoruz.
• Destroy form üzerinden submit edilmelidir. Çünkü GET ile request kabul etmez.
<form action="{{ route('blog.destroy', ['id' => $blog->id]) }}”>
<input name="_method" type="hidden" value=”DELETE">
</form>
Link olarak göndermek istiyorsanız GET ile yeni bir rota ve fonksiyon oluşturmalısınız.
Route
Route::get('blog/delete/{id}', ['as' => 'blog.delete’, 'uses' => 'BlogController@delete']);
BlogController
Public function delete($id) {}...